<?php

/*
 *
 *  ____            _        _   __  __ _                  __  __ ____
 * |  _ \ ___   ___| | _____| |_|  \/  (_)_ __   ___      |  \/  |  _ \
 * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
 * |  __/ (_) | (__|   <  __/ |_| |  | | | | | |  __/_____| |  | |  __/
 * |_|   \___/ \___|_|\_\___|\__|_|  |_|_|_| |_|\___|     |_|  |_|_|
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * @author PocketMine Team
 * @link http://www.pocketmine.net/
 *
 *
 */

declare(strict_types=1);

namespace pocketmine\item;

use pocketmine\block\AmethystCluster;
use pocketmine\block\Block;
use pocketmine\block\Light;
use pocketmine\block\utils\CopperOxidation;
use pocketmine\block\utils\CoralType;
use pocketmine\block\utils\DirtType;
use pocketmine\block\utils\DyeColor;
use pocketmine\block\utils\FroglightType;
use pocketmine\block\utils\MobHeadType;
use pocketmine\block\utils\SlabType;
use pocketmine\block\VanillaBlocks as Blocks;
use pocketmine\item\VanillaItems as Items;
use pocketmine\utils\SingletonTrait;
use pocketmine\utils\StringToTParser;
use function array_keys;
use function count;
use function strtolower;

/**
 * Handles parsing items from strings. This is used to interpret names from the /give command (and others).
 *
 * @phpstan-extends StringToTParser<Item>
 */
final class StringToItemParser extends StringToTParser{
	use SingletonTrait;

	private static function make() : self{
		$result = new self();

		self::registerDynamicBlocks($result);
		self::registerBlocks($result);
		self::registerDynamicItems($result);
		self::registerItems($result);

		return $result;
	}

	private static function registerDynamicBlocks(self $result) : void{
		foreach(DyeColor::cases() as $color){
			$register = fn(string $name, \Closure $callback) => $result->registerBlock(strtolower($color->name) . "_" . $name, $callback);
			//wall and floor banner are the same item
			$register("banner", fn() => Blocks::BANNER()->setColor($color));
			$register("bed", fn() => Blocks::BED()->setColor($color));
			$register("candle", fn() => Blocks::DYED_CANDLE()->setColor($color));
			$register("carpet", fn() => Blocks::CARPET()->setColor($color));
			$register("concrete", fn() => Blocks::CONCRETE()->setColor($color));
			$register("concrete_powder", fn() => Blocks::CONCRETE_POWDER()->setColor($color));
			$register("glazed_terracotta", fn() => Blocks::GLAZED_TERRACOTTA()->setColor($color));
			$register("stained_clay", fn() => Blocks::STAINED_CLAY()->setColor($color));
			$register("stained_glass", fn() => Blocks::STAINED_GLASS()->setColor($color));
			$register("stained_glass_pane", fn() => Blocks::STAINED_GLASS_PANE()->setColor($color));
			$register("stained_hardened_glass", fn() => Blocks::STAINED_HARDENED_GLASS()->setColor($color));
			$register("stained_hardened_glass_pane", fn() => Blocks::STAINED_HARDENED_GLASS_PANE()->setColor($color));
			$register("wool", fn() => Blocks::WOOL()->setColor($color));
			$register("shulker_box", fn() => Blocks::DYED_SHULKER_BOX()->setColor($color));
		}

		foreach(CoralType::cases() as $coralType){
			$register = fn(string $name, \Closure $callback) => $result->registerBlock(strtolower($coralType->name) . "_" . $name, $callback);
			$register("coral", fn() => Blocks::CORAL()->setCoralType($coralType));
			$register("coral_block", fn() => Blocks::CORAL_BLOCK()->setCoralType($coralType));
			//wall and floor coral fans are the same item
			$register("coral_fan", fn() => Blocks::CORAL_FAN()->setCoralType($coralType));
		}
		for($i = Light::MIN_LIGHT_LEVEL; $i <= Light::MAX_LIGHT_LEVEL; $i++){
			//helper aliases, since we don't support passing data values in /give
			$result->registerBlock("light_$i", fn() => Blocks::LIGHT()->setLightLevel($i));
			$result->registerBlock("light_block_$i", fn() => Blocks::LIGHT()->setLightLevel($i));
		}

		foreach(CopperOxidation::cases() as $oxidation){
			$oxPrefix = $oxidation === CopperOxidation::NONE ? "" : strtolower($oxidation->name) . "_";

			foreach(["" => false, "waxed_" => true] as $waxedPrefix => $waxed){
				$register = fn(string $name, \Closure $callback) => $result->registerBlock($waxedPrefix . $oxPrefix . $name, $callback);
				$register("copper_block", fn() => Blocks::COPPER()->setOxidation($oxidation)->setWaxed($waxed));
				$register("chiseled_copper", fn() => Blocks::CHISELED_COPPER()->setOxidation($oxidation)->setWaxed($waxed));
				$register("copper_grate", fn() => Blocks::COPPER_GRATE()->setOxidation($oxidation)->setWaxed($waxed));
				$register("cut_copper_block", fn() => Blocks::CUT_COPPER()->setOxidation($oxidation)->setWaxed($waxed));
				$register("cut_copper_stairs", fn() => Blocks::CUT_COPPER_STAIRS()->setOxidation($oxidation)->setWaxed($waxed));
				$register("cut_copper_slab", fn() => Blocks::CUT_COPPER_SLAB()->setOxidation($oxidation)->setWaxed($waxed));
				$register("copper_bulb", fn() => Blocks::COPPER_BULB()->setOxidation($oxidation)->setWaxed($waxed));
				$register("copper_door", fn() => Blocks::COPPER_DOOR()->setOxidation($oxidation)->setWaxed($waxed));
				$register("copper_trapdoor", fn() => Blocks::COPPER_TRAPDOOR()->setOxidation($oxidation)->setWaxed($waxed));
				$register("copper_bars", fn() => Blocks::COPPER_BARS()->setOxidation($oxidation)->setWaxed($waxed));
				$register("copper_chain", fn() => Blocks::COPPER_CHAIN()->setOxidation($oxidation)->setWaxed($waxed));
				$register("copper_lantern", fn() => Blocks::COPPER_LANTERN()->setOxidation($oxidation)->setWaxed($waxed));
				$register("lightning_rod", fn() => Blocks::LIGHTNING_ROD()->setOxidation($oxidation)->setWaxed($waxed));
			}
		}

		foreach(FroglightType::cases() as $froglightType){
			$result->registerBlock(strtolower($froglightType->name) . "_froglight", fn() => Blocks::FROGLIGHT()->setFroglightType($froglightType));
		}
	}

	private static function registerBlocks(self $result) : void{
		$result->registerBlock("acacia_button", fn() => Blocks::ACACIA_BUTTON());
		$result->registerBlock("acacia_door", fn() => Blocks::ACACIA_DOOR());
		$result->registerBlock("acacia_door_block", fn() => Blocks::ACACIA_DOOR());
		$result->registerBlock("acacia_fence", fn() => Blocks::ACACIA_FENCE());
		$result->registerBlock("acacia_fence_gate", fn() => Blocks::ACACIA_FENCE_GATE());
		$result->registerBlock("acacia_leaves", fn() => Blocks::ACACIA_LEAVES());
		$result->registerBlock("acacia_log", fn() => Blocks::ACACIA_LOG()->setStripped(false));
		$result->registerBlock("acacia_planks", fn() => Blocks::ACACIA_PLANKS());
		$result->registerBlock("acacia_pressure_plate", fn() => Blocks::ACACIA_PRESSURE_PLATE());
		$result->registerBlock("acacia_sapling", fn() => Blocks::ACACIA_SAPLING());
		$result->registerBlock("acacia_sign", fn() => Blocks::ACACIA_SIGN());
		$result->registerBlock("acacia_slab", fn() => Blocks::ACACIA_SLAB());
		$result->registerBlock("acacia_stairs", fn() => Blocks::ACACIA_STAIRS());
		$result->registerBlock("acacia_standing_sign", fn() => Blocks::ACACIA_SIGN());
		$result->registerBlock("acacia_trapdoor", fn() => Blocks::ACACIA_TRAPDOOR());
		$result->registerBlock("acacia_wall_sign", fn() => Blocks::ACACIA_WALL_SIGN());
		$result->registerBlock("acacia_wood", fn() => Blocks::ACACIA_WOOD()->setStripped(false));
		$result->registerBlock("acacia_wood_stairs", fn() => Blocks::ACACIA_STAIRS());
		$result->registerBlock("acacia_wooden_stairs", fn() => Blocks::ACACIA_STAIRS());
		$result->registerBlock("activator_rail", fn() => Blocks::ACTIVATOR_RAIL());
		$result->registerBlock("active_redstone_lamp", fn() => Blocks::REDSTONE_LAMP()->setPowered(true));
		$result->registerBlock("air", fn() => Blocks::AIR());
		$result->registerBlock("all_sided_mushroom_stem", fn() => Blocks::ALL_SIDED_MUSHROOM_STEM());
		$result->registerBlock("allium", fn() => Blocks::ALLIUM());
		$result->registerBlock("amethyst_block", fn() => Blocks::AMETHYST());
		$result->registerBlock("amethyst_cluster", fn() => Blocks::AMETHYST_CLUSTER());
		$result->registerBlock("ancient_debris", fn() => Blocks::ANCIENT_DEBRIS());
		$result->registerBlock("andesite", fn() => Blocks::ANDESITE());
		$result->registerBlock("andesite_slab", fn() => Blocks::ANDESITE_SLAB());
		$result->registerBlock("andesite_stairs", fn() => Blocks::ANDESITE_STAIRS());
		$result->registerBlock("andesite_wall", fn() => Blocks::ANDESITE_WALL());
		$result->registerBlock("anvil", fn() => Blocks::ANVIL());
		$result->registerBlock("ateupd_block", fn() => Blocks::INFO_UPDATE2());
		$result->registerBlock("azalea_leaves", fn() => Blocks::AZALEA_LEAVES());
		$result->registerBlock("azure_bluet", fn() => Blocks::AZURE_BLUET());
		$result->registerBlock("bamboo", fn() => Blocks::BAMBOO());
		$result->registerBlock("bamboo_sapling", fn() => Blocks::BAMBOO_SAPLING());
		$result->registerBlock("banner", fn() => Blocks::BANNER());
		$result->registerBlock("barrel", fn() => Blocks::BARREL());
		$result->registerBlock("barrier", fn() => Blocks::BARRIER());
		$result->registerBlock("basalt", fn() => Blocks::BASALT());
		$result->registerBlock("beacon", fn() => Blocks::BEACON());
		$result->registerBlock("bed", fn() => Blocks::BED());
		$result->registerBlock("bed_block", fn() => Blocks::BED());
		$result->registerBlock("bedrock", fn() => Blocks::BEDROCK());
		$result->registerBlock("beetroot_block", fn() => Blocks::BEETROOTS());
		$result->registerBlock("beetroots", fn() => Blocks::BEETROOTS());
		$result->registerBlock("bell", fn() => Blocks::BELL());
		$result->registerBlock("big_dripleaf", fn() => Blocks::BIG_DRIPLEAF_HEAD());
		$result->registerBlock("birch_button", fn() => Blocks::BIRCH_BUTTON());
		$result->registerBlock("birch_door", fn() => Blocks::BIRCH_DOOR());
		$result->registerBlock("birch_door_block", fn() => Blocks::BIRCH_DOOR());
		$result->registerBlock("birch_fence", fn() => Blocks::BIRCH_FENCE());
		$result->registerBlock("birch_fence_gate", fn() => Blocks::BIRCH_FENCE_GATE());
		$result->registerBlock("birch_leaves", fn() => Blocks::BIRCH_LEAVES());
		$result->registerBlock("birch_log", fn() => Blocks::BIRCH_LOG()->setStripped(false));
		$result->registerBlock("birch_planks", fn() => Blocks::BIRCH_PLANKS());
		$result->registerBlock("birch_pressure_plate", fn() => Blocks::BIRCH_PRESSURE_PLATE());
		$result->registerBlock("birch_sapling", fn() => Blocks::BIRCH_SAPLING());
		$result->registerBlock("birch_sign", fn() => Blocks::BIRCH_SIGN());
		$result->registerBlock("birch_slab", fn() => Blocks::BIRCH_SLAB());
		$result->registerBlock("birch_stairs", fn() => Blocks::BIRCH_STAIRS());
		$result->registerBlock("birch_standing_sign", fn() => Blocks::BIRCH_SIGN());
		$result->registerBlock("birch_trapdoor", fn() => Blocks::BIRCH_TRAPDOOR());
		$result->registerBlock("birch_wall_sign", fn() => Blocks::BIRCH_WALL_SIGN());
		$result->registerBlock("birch_wood", fn() => Blocks::BIRCH_WOOD()->setStripped(false));
		$result->registerBlock("birch_wood_stairs", fn() => Blocks::BIRCH_STAIRS());
		$result->registerBlock("birch_wooden_stairs", fn() => Blocks::BIRCH_STAIRS());
		$result->registerBlock("blackstone", fn() => Blocks::BLACKSTONE());
		$result->registerBlock("blackstone_slab", fn() => Blocks::BLACKSTONE_SLAB());
		$result->registerBlock("blackstone_stairs", fn() => Blocks::BLACKSTONE_STAIRS());
		$result->registerBlock("blackstone_wall", fn() => Blocks::BLACKSTONE_WALL());
		$result->registerBlock("blast_furnace", fn() => Blocks::BLAST_FURNACE());
		$result->registerBlock("blue_ice", fn() => Blocks::BLUE_ICE());
		$result->registerBlock("blue_orchid", fn() => Blocks::BLUE_ORCHID());
		$result->registerBlock("blue_torch", fn() => Blocks::BLUE_TORCH());
		$result->registerBlock("bone_block", fn() => Blocks::BONE_BLOCK());
		$result->registerBlock("bookshelf", fn() => Blocks::BOOKSHELF());
		$result->registerBlock("brewing_stand", fn() => Blocks::BREWING_STAND());
		$result->registerBlock("brewing_stand_block", fn() => Blocks::BREWING_STAND());
		$result->registerBlock("brick_block", fn() => Blocks::BRICKS());
		$result->registerBlock("brick_slab", fn() => Blocks::BRICK_SLAB());
		$result->registerBlock("brick_stairs", fn() => Blocks::BRICK_STAIRS());
		$result->registerBlock("brick_wall", fn() => Blocks::BRICK_WALL());
		$result->registerBlock("bricks", fn() => Blocks::BRICKS());
		$result->registerBlock("bricks_block", fn() => Blocks::BRICKS());
		$result->registerBlock("brown_mushroom", fn() => Blocks::BROWN_MUSHROOM());
		$result->registerBlock("brown_mushroom_block", fn() => Blocks::BROWN_MUSHROOM_BLOCK());
		$result->registerBlock("budding_amethyst", fn() => Blocks::BUDDING_AMETHYST());
		$result->registerBlock("burning_furnace", fn() => Blocks::FURNACE());
		$result->registerBlock("bush", fn() => Blocks::DEAD_BUSH());
		$result->registerBlock("cactus", fn() => Blocks::CACTUS());
		$result->registerBlock("cactus_flower", fn() => Blocks::CACTUS_FLOWER());
		$result->registerBlock("cake", fn() => Blocks::CAKE());
		$result->registerBlock("cake_block", fn() => Blocks::CAKE());
		$result->registerBlock("calcite", fn() => Blocks::CALCITE());
		$result->registerBlock("campfire", fn() => Blocks::CAMPFIRE());
		$result->registerBlock("candle", fn() => Blocks::CANDLE());
		$result->registerBlock("carpet", fn() => Blocks::CARPET());
		$result->registerBlock("carrot_block", fn() => Blocks::CARROTS());
		$result->registerBlock("carrots", fn() => Blocks::CARROTS());
		$result->registerBlock("cartography_table", fn() => Blocks::CARTOGRAPHY_TABLE());
		$result->registerBlock("carved_pumpkin", fn() => Blocks::CARVED_PUMPKIN());
		$result->registerBlock("cauldron", fn() => Blocks::CAULDRON());
		$result->registerBlock("cave_vines", fn() => Blocks::CAVE_VINES());
		$result->registerBlock("chain", fn() => Blocks::CHAIN());
		$result->registerBlock("cherry_button", fn() => Blocks::CHERRY_BUTTON());
		$result->registerBlock("cherry_door", fn() => Blocks::CHERRY_DOOR());
		$result->registerBlock("cherry_fence", fn() => Blocks::CHERRY_FENCE());
		$result->registerBlock("cherry_fence_gate", fn() => Blocks::CHERRY_FENCE_GATE());
		$result->registerBlock("cherry_leaves", fn() => Blocks::CHERRY_LEAVES());
		$result->registerBlock("cherry_log", fn() => Blocks::CHERRY_LOG());
		$result->registerBlock("cherry_planks", fn() => Blocks::CHERRY_PLANKS());
		$result->registerBlock("cherry_pressure_plate", fn() => Blocks::CHERRY_PRESSURE_PLATE());
		$result->registerBlock("cherry_sign", fn() => Blocks::CHERRY_SIGN());
		$result->registerBlock("cherry_slab", fn() => Blocks::CHERRY_SLAB());
		$result->registerBlock("cherry_stairs", fn() => Blocks::CHERRY_STAIRS());
		$result->registerBlock("cherry_trapdoor", fn() => Blocks::CHERRY_TRAPDOOR());
		$result->registerBlock("cherry_wood", fn() => Blocks::CHERRY_WOOD());
		$result->registerBlock("chemical_heat", fn() => Blocks::CHEMICAL_HEAT());
		$result->registerBlock("chemistry_table", fn() => Blocks::COMPOUND_CREATOR());
		$result->registerBlock("chest", fn() => Blocks::CHEST());
		$result->registerBlock("chipped_anvil", fn() => Blocks::ANVIL()->setDamage(1));
		$result->registerBlock("chiseled_bookshelf", fn() => Blocks::CHISELED_BOOKSHELF());
		$result->registerBlock("chiseled_deepslate", fn() => Blocks::CHISELED_DEEPSLATE());
		$result->registerBlock("chiseled_nether_bricks", fn() => Blocks::CHISELED_NETHER_BRICKS());
		$result->registerBlock("chiseled_polished_blackstone", fn() => Blocks::CHISELED_POLISHED_BLACKSTONE());
		$result->registerBlock("chiseled_quartz", fn() => Blocks::CHISELED_QUARTZ());
		$result->registerBlock("chiseled_red_sandstone", fn() => Blocks::CHISELED_RED_SANDSTONE());
		$result->registerBlock("chiseled_resin_bricks", fn() => Blocks::CHISELED_RESIN_BRICKS());
		$result->registerBlock("chiseled_sandstone", fn() => Blocks::CHISELED_SANDSTONE());
		$result->registerBlock("chiseled_stone_bricks", fn() => Blocks::CHISELED_STONE_BRICKS());
		$result->registerBlock("chiseled_tuff", fn() => Blocks::CHISELED_TUFF());
		$result->registerBlock("chiseled_tuff_bricks", fn() => Blocks::CHISELED_TUFF_BRICKS());
		$result->registerBlock("chorus_flower", fn() => Blocks::CHORUS_FLOWER());
		$result->registerBlock("chorus_plant", fn() => Blocks::CHORUS_PLANT());
		$result->registerBlock("clay_block", fn() => Blocks::CLAY());
		$result->registerBlock("coal_block", fn() => Blocks::COAL());
		$result->registerBlock("coal_ore", fn() => Blocks::COAL_ORE());
		$result->registerBlock("coarse_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::COARSE));
		$result->registerBlock("cobble", fn() => Blocks::COBBLESTONE());
		$result->registerBlock("cobble_stairs", fn() => Blocks::COBBLESTONE_STAIRS());
		$result->registerBlock("cobble_wall", fn() => Blocks::COBBLESTONE_WALL());
		$result->registerBlock("cobbled_deepslate", fn() => Blocks::COBBLED_DEEPSLATE());
		$result->registerBlock("cobbled_deepslate_slab", fn() => Blocks::COBBLED_DEEPSLATE_SLAB());
		$result->registerBlock("cobbled_deepslate_stairs", fn() => Blocks::COBBLED_DEEPSLATE_STAIRS());
		$result->registerBlock("cobbled_deepslate_wall", fn() => Blocks::COBBLED_DEEPSLATE_WALL());
		$result->registerBlock("cobblestone", fn() => Blocks::COBBLESTONE());
		$result->registerBlock("cobblestone_slab", fn() => Blocks::COBBLESTONE_SLAB());
		$result->registerBlock("cobblestone_stairs", fn() => Blocks::COBBLESTONE_STAIRS());
		$result->registerBlock("cobblestone_wall", fn() => Blocks::COBBLESTONE_WALL());
		$result->registerBlock("cobweb", fn() => Blocks::COBWEB());
		$result->registerBlock("cocoa", fn() => Blocks::COCOA_POD());
		$result->registerBlock("cocoa_block", fn() => Blocks::COCOA_POD());
		$result->registerBlock("cocoa_pod", fn() => Blocks::COCOA_POD());
		$result->registerBlock("cocoa_pods", fn() => Blocks::COCOA_POD());
		$result->registerBlock("colored_torch_bp", fn() => Blocks::BLUE_TORCH());
		$result->registerBlock("colored_torch_rg", fn() => Blocks::RED_TORCH());
		$result->registerBlock("comparator", fn() => Blocks::REDSTONE_COMPARATOR());
		$result->registerBlock("comparator_block", fn() => Blocks::REDSTONE_COMPARATOR());
		$result->registerBlock("compound_creator", fn() => Blocks::COMPOUND_CREATOR());
		$result->registerBlock("concrete", fn() => Blocks::CONCRETE());
		$result->registerBlock("concrete_powder", fn() => Blocks::CONCRETE_POWDER());
		$result->registerBlock("concretepowder", fn() => Blocks::CONCRETE_POWDER());
		$result->registerBlock("copper_ore", fn() => Blocks::COPPER_ORE());
		$result->registerBlock("copper_torch", fn() => Blocks::COPPER_TORCH());
		$result->registerBlock("coral", fn() => Blocks::CORAL());
		$result->registerBlock("coral_block", fn() => Blocks::CORAL_BLOCK());
		$result->registerBlock("coral_fan", fn() => Blocks::CORAL_FAN());
		$result->registerBlock("coral_fan_dead", fn() => Blocks::CORAL_FAN()->setCoralType(CoralType::TUBE)->setDead(true));
		$result->registerBlock("coral_fan_hang", fn() => Blocks::WALL_CORAL_FAN());
		$result->registerBlock("coral_fan_hang2", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::BUBBLE));
		$result->registerBlock("coral_fan_hang3", fn() => Blocks::WALL_CORAL_FAN()->setCoralType(CoralType::HORN));
		$result->registerBlock("cornflower", fn() => Blocks::CORNFLOWER());
		$result->registerBlock("cracked_deepslate_bricks", fn() => Blocks::CRACKED_DEEPSLATE_BRICKS());
		$result->registerBlock("cracked_deepslate_tiles", fn() => Blocks::CRACKED_DEEPSLATE_TILES());
		$result->registerBlock("cracked_nether_bricks", fn() => Blocks::CRACKED_NETHER_BRICKS());
		$result->registerBlock("cracked_polished_blackstone_bricks", fn() => Blocks::CRACKED_POLISHED_BLACKSTONE_BRICKS());
		$result->registerBlock("cracked_stone_bricks", fn() => Blocks::CRACKED_STONE_BRICKS());
		$result->registerBlock("crafting_table", fn() => Blocks::CRAFTING_TABLE());
		$result->registerBlock("creeper_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::CREEPER));
		$result->registerBlock("crimson_button", fn() => Blocks::CRIMSON_BUTTON());
		$result->registerBlock("crimson_door", fn() => Blocks::CRIMSON_DOOR());
		$result->registerBlock("crimson_fence", fn() => Blocks::CRIMSON_FENCE());
		$result->registerBlock("crimson_fence_gate", fn() => Blocks::CRIMSON_FENCE_GATE());
		$result->registerBlock("crimson_hyphae", fn() => Blocks::CRIMSON_HYPHAE()->setStripped(false));
		$result->registerBlock("crimson_planks", fn() => Blocks::CRIMSON_PLANKS());
		$result->registerBlock("crimson_pressure_plate", fn() => Blocks::CRIMSON_PRESSURE_PLATE());
		$result->registerBlock("crimson_roots", fn() => Blocks::CRIMSON_ROOTS());
		$result->registerBlock("crimson_sign", fn() => Blocks::CRIMSON_SIGN());
		$result->registerBlock("crimson_slab", fn() => Blocks::CRIMSON_SLAB());
		$result->registerBlock("crimson_stairs", fn() => Blocks::CRIMSON_STAIRS());
		$result->registerBlock("crimson_stem", fn() => Blocks::CRIMSON_STEM()->setStripped(false));
		$result->registerBlock("crimson_trapdoor", fn() => Blocks::CRIMSON_TRAPDOOR());
		$result->registerBlock("crying_obsidian", fn() => Blocks::CRYING_OBSIDIAN());
		$result->registerBlock("cut_red_sandstone", fn() => Blocks::CUT_RED_SANDSTONE());
		$result->registerBlock("cut_red_sandstone_slab", fn() => Blocks::CUT_RED_SANDSTONE_SLAB());
		$result->registerBlock("cut_sandstone", fn() => Blocks::CUT_SANDSTONE());
		$result->registerBlock("cut_sandstone_slab", fn() => Blocks::CUT_SANDSTONE_SLAB());
		$result->registerBlock("damaged_anvil", fn() => Blocks::ANVIL()->setDamage(2));
		$result->registerBlock("dandelion", fn() => Blocks::DANDELION());
		$result->registerBlock("dark_oak_button", fn() => Blocks::DARK_OAK_BUTTON());
		$result->registerBlock("dark_oak_door", fn() => Blocks::DARK_OAK_DOOR());
		$result->registerBlock("dark_oak_door_block", fn() => Blocks::DARK_OAK_DOOR());
		$result->registerBlock("dark_oak_fence", fn() => Blocks::DARK_OAK_FENCE());
		$result->registerBlock("dark_oak_fence_gate", fn() => Blocks::DARK_OAK_FENCE_GATE());
		$result->registerBlock("dark_oak_leaves", fn() => Blocks::DARK_OAK_LEAVES());
		$result->registerBlock("dark_oak_log", fn() => Blocks::DARK_OAK_LOG()->setStripped(false));
		$result->registerBlock("dark_oak_planks", fn() => Blocks::DARK_OAK_PLANKS());
		$result->registerBlock("dark_oak_pressure_plate", fn() => Blocks::DARK_OAK_PRESSURE_PLATE());
		$result->registerBlock("dark_oak_sapling", fn() => Blocks::DARK_OAK_SAPLING());
		$result->registerBlock("dark_oak_sign", fn() => Blocks::DARK_OAK_SIGN());
		$result->registerBlock("dark_oak_slab", fn() => Blocks::DARK_OAK_SLAB());
		$result->registerBlock("dark_oak_stairs", fn() => Blocks::DARK_OAK_STAIRS());
		$result->registerBlock("dark_oak_standing_sign", fn() => Blocks::DARK_OAK_SIGN());
		$result->registerBlock("dark_oak_trapdoor", fn() => Blocks::DARK_OAK_TRAPDOOR());
		$result->registerBlock("dark_oak_wall_sign", fn() => Blocks::DARK_OAK_WALL_SIGN());
		$result->registerBlock("dark_oak_wood", fn() => Blocks::DARK_OAK_WOOD()->setStripped(false));
		$result->registerBlock("dark_oak_wood_stairs", fn() => Blocks::DARK_OAK_STAIRS());
		$result->registerBlock("dark_oak_wooden_stairs", fn() => Blocks::DARK_OAK_STAIRS());
		$result->registerBlock("dark_prismarine", fn() => Blocks::DARK_PRISMARINE());
		$result->registerBlock("dark_prismarine_slab", fn() => Blocks::DARK_PRISMARINE_SLAB());
		$result->registerBlock("dark_prismarine_stairs", fn() => Blocks::DARK_PRISMARINE_STAIRS());
		$result->registerBlock("darkoak_sign", fn() => Blocks::DARK_OAK_SIGN());
		$result->registerBlock("darkoak_standing_sign", fn() => Blocks::DARK_OAK_SIGN());
		$result->registerBlock("darkoak_wall_sign", fn() => Blocks::DARK_OAK_WALL_SIGN());
		$result->registerBlock("daylight_detector", fn() => Blocks::DAYLIGHT_SENSOR());
		$result->registerBlock("daylight_detector_inverted", fn() => Blocks::DAYLIGHT_SENSOR()->setInverted(true));
		$result->registerBlock("daylight_sensor", fn() => Blocks::DAYLIGHT_SENSOR());
		$result->registerBlock("daylight_sensor_inverted", fn() => Blocks::DAYLIGHT_SENSOR()->setInverted(true));
		$result->registerBlock("dead_bush", fn() => Blocks::DEAD_BUSH());
		$result->registerBlock("deadbush", fn() => Blocks::DEAD_BUSH());
		$result->registerBlock("deepslate", fn() => Blocks::DEEPSLATE());
		$result->registerBlock("deepslate_bricks", fn() => Blocks::DEEPSLATE_BRICKS());
		$result->registerBlock("deepslate_brick_slab", fn() => Blocks::DEEPSLATE_BRICK_SLAB());
		$result->registerBlock("deepslate_brick_stairs", fn() => Blocks::DEEPSLATE_BRICK_STAIRS());
		$result->registerBlock("deepslate_brick_wall", fn() => Blocks::DEEPSLATE_BRICK_WALL());
		$result->registerBlock("deepslate_tiles", fn() => Blocks::DEEPSLATE_TILES());
		$result->registerBlock("deepslate_tile_slab", fn() => Blocks::DEEPSLATE_TILE_SLAB());
		$result->registerBlock("deepslate_tile_stairs", fn() => Blocks::DEEPSLATE_TILE_STAIRS());
		$result->registerBlock("deepslate_tile_wall", fn() => Blocks::DEEPSLATE_TILE_WALL());
		$result->registerBlock("deepslate_coal_ore", fn() => Blocks::DEEPSLATE_COAL_ORE());
		$result->registerBlock("deepslate_copper_ore", fn() => Blocks::DEEPSLATE_COPPER_ORE());
		$result->registerBlock("deepslate_diamond_ore", fn() => Blocks::DEEPSLATE_DIAMOND_ORE());
		$result->registerBlock("deepslate_emerald_ore", fn() => Blocks::DEEPSLATE_EMERALD_ORE());
		$result->registerBlock("deepslate_gold_ore", fn() => Blocks::DEEPSLATE_GOLD_ORE());
		$result->registerBlock("deepslate_iron_ore", fn() => Blocks::DEEPSLATE_IRON_ORE());
		$result->registerBlock("deepslate_lapis_lazuli_ore", fn() => Blocks::DEEPSLATE_LAPIS_LAZULI_ORE());
		$result->registerBlock("deepslate_redstone_ore", fn() => Blocks::DEEPSLATE_REDSTONE_ORE());
		$result->registerBlock("detector_rail", fn() => Blocks::DETECTOR_RAIL());
		$result->registerBlock("diamond_block", fn() => Blocks::DIAMOND());
		$result->registerBlock("diamond_ore", fn() => Blocks::DIAMOND_ORE());
		$result->registerBlock("diorite", fn() => Blocks::DIORITE());
		$result->registerBlock("diorite_slab", fn() => Blocks::DIORITE_SLAB());
		$result->registerBlock("diorite_stairs", fn() => Blocks::DIORITE_STAIRS());
		$result->registerBlock("diorite_wall", fn() => Blocks::DIORITE_WALL());
		$result->registerBlock("dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::NORMAL));
		$result->registerBlock("dirt_with_roots", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED));
		$result->registerBlock("door_block", fn() => Blocks::OAK_DOOR());
		$result->registerBlock("double_plant", fn() => Blocks::SUNFLOWER());
		$result->registerBlock("double_red_sandstone_slab", fn() => Blocks::RED_SANDSTONE_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_slab", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_slabs", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_stone_slab", fn() => Blocks::STONE_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_stone_slab2", fn() => Blocks::RED_SANDSTONE_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_stone_slab3", fn() => Blocks::END_STONE_BRICK_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_stone_slab4", fn() => Blocks::MOSSY_STONE_BRICK_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_tallgrass", fn() => Blocks::DOUBLE_TALLGRASS());
		$result->registerBlock("double_wood_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_wood_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_wooden_slab", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("double_wooden_slabs", fn() => Blocks::OAK_SLAB()->setSlabType(SlabType::DOUBLE));
		$result->registerBlock("dragon_egg", fn() => Blocks::DRAGON_EGG());
		$result->registerBlock("dragon_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::DRAGON));
		$result->registerBlock("dried_kelp_block", fn() => Blocks::DRIED_KELP());
		$result->registerBlock("dyed_shulker_box", fn() => Blocks::DYED_SHULKER_BOX());
		$result->registerBlock("element_0", fn() => Blocks::ELEMENT_ZERO());
		$result->registerBlock("element_1", fn() => Blocks::ELEMENT_HYDROGEN());
		$result->registerBlock("element_10", fn() => Blocks::ELEMENT_NEON());
		$result->registerBlock("element_100", fn() => Blocks::ELEMENT_FERMIUM());
		$result->registerBlock("element_101", fn() => Blocks::ELEMENT_MENDELEVIUM());
		$result->registerBlock("element_102", fn() => Blocks::ELEMENT_NOBELIUM());
		$result->registerBlock("element_103", fn() => Blocks::ELEMENT_LAWRENCIUM());
		$result->registerBlock("element_104", fn() => Blocks::ELEMENT_RUTHERFORDIUM());
		$result->registerBlock("element_105", fn() => Blocks::ELEMENT_DUBNIUM());
		$result->registerBlock("element_106", fn() => Blocks::ELEMENT_SEABORGIUM());
		$result->registerBlock("element_107", fn() => Blocks::ELEMENT_BOHRIUM());
		$result->registerBlock("element_108", fn() => Blocks::ELEMENT_HASSIUM());
		$result->registerBlock("element_109", fn() => Blocks::ELEMENT_MEITNERIUM());
		$result->registerBlock("element_11", fn() => Blocks::ELEMENT_SODIUM());
		$result->registerBlock("element_110", fn() => Blocks::ELEMENT_DARMSTADTIUM());
		$result->registerBlock("element_111", fn() => Blocks::ELEMENT_ROENTGENIUM());
		$result->registerBlock("element_112", fn() => Blocks::ELEMENT_COPERNICIUM());
		$result->registerBlock("element_113", fn() => Blocks::ELEMENT_NIHONIUM());
		$result->registerBlock("element_114", fn() => Blocks::ELEMENT_FLEROVIUM());
		$result->registerBlock("element_115", fn() => Blocks::ELEMENT_MOSCOVIUM());
		$result->registerBlock("element_116", fn() => Blocks::ELEMENT_LIVERMORIUM());
		$result->registerBlock("element_117", fn() => Blocks::ELEMENT_TENNESSINE());
		$result->registerBlock("element_118", fn() => Blocks::ELEMENT_OGANESSON());
		$result->registerBlock("element_12", fn() => Blocks::ELEMENT_MAGNESIUM());
		$result->registerBlock("element_13", fn() => Blocks::ELEMENT_ALUMINUM());
		$result->registerBlock("element_14", fn() => Blocks::ELEMENT_SILICON());
		$result->registerBlock("element_15", fn() => Blocks::ELEMENT_PHOSPHORUS());
		$result->registerBlock("element_16", fn() => Blocks::ELEMENT_SULFUR());
		$result->registerBlock("element_17", fn() => Blocks::ELEMENT_CHLORINE());
		$result->registerBlock("element_18", fn() => Blocks::ELEMENT_ARGON());
		$result->registerBlock("element_19", fn() => Blocks::ELEMENT_POTASSIUM());
		$result->registerBlock("element_2", fn() => Blocks::ELEMENT_HELIUM());
		$result->registerBlock("element_20", fn() => Blocks::ELEMENT_CALCIUM());
		$result->registerBlock("element_21", fn() => Blocks::ELEMENT_SCANDIUM());
		$result->registerBlock("element_22", fn() => Blocks::ELEMENT_TITANIUM());
		$result->registerBlock("element_23", fn() => Blocks::ELEMENT_VANADIUM());
		$result->registerBlock("element_24", fn() => Blocks::ELEMENT_CHROMIUM());
		$result->registerBlock("element_25", fn() => Blocks::ELEMENT_MANGANESE());
		$result->registerBlock("element_26", fn() => Blocks::ELEMENT_IRON());
		$result->registerBlock("element_27", fn() => Blocks::ELEMENT_COBALT());
		$result->registerBlock("element_28", fn() => Blocks::ELEMENT_NICKEL());
		$result->registerBlock("element_29", fn() => Blocks::ELEMENT_COPPER());
		$result->registerBlock("element_3", fn() => Blocks::ELEMENT_LITHIUM());
		$result->registerBlock("element_30", fn() => Blocks::ELEMENT_ZINC());
		$result->registerBlock("element_31", fn() => Blocks::ELEMENT_GALLIUM());
		$result->registerBlock("element_32", fn() => Blocks::ELEMENT_GERMANIUM());
		$result->registerBlock("element_33", fn() => Blocks::ELEMENT_ARSENIC());
		$result->registerBlock("element_34", fn() => Blocks::ELEMENT_SELENIUM());
		$result->registerBlock("element_35", fn() => Blocks::ELEMENT_BROMINE());
		$result->registerBlock("element_36", fn() => Blocks::ELEMENT_KRYPTON());
		$result->registerBlock("element_37", fn() => Blocks::ELEMENT_RUBIDIUM());
		$result->registerBlock("element_38", fn() => Blocks::ELEMENT_STRONTIUM());
		$result->registerBlock("element_39", fn() => Blocks::ELEMENT_YTTRIUM());
		$result->registerBlock("element_4", fn() => Blocks::ELEMENT_BERYLLIUM());
		$result->registerBlock("element_40", fn() => Blocks::ELEMENT_ZIRCONIUM());
		$result->registerBlock("element_41", fn() => Blocks::ELEMENT_NIOBIUM());
		$result->registerBlock("element_42", fn() => Blocks::ELEMENT_MOLYBDENUM());
		$result->registerBlock("element_43", fn() => Blocks::ELEMENT_TECHNETIUM());
		$result->registerBlock("element_44", fn() => Blocks::ELEMENT_RUTHENIUM());
		$result->registerBlock("element_45", fn() => Blocks::ELEMENT_RHODIUM());
		$result->registerBlock("element_46", fn() => Blocks::ELEMENT_PALLADIUM());
		$result->registerBlock("element_47", fn() => Blocks::ELEMENT_SILVER());
		$result->registerBlock("element_48", fn() => Blocks::ELEMENT_CADMIUM());
		$result->registerBlock("element_49", fn() => Blocks::ELEMENT_INDIUM());
		$result->registerBlock("element_5", fn() => Blocks::ELEMENT_BORON());
		$result->registerBlock("element_50", fn() => Blocks::ELEMENT_TIN());
		$result->registerBlock("element_51", fn() => Blocks::ELEMENT_ANTIMONY());
		$result->registerBlock("element_52", fn() => Blocks::ELEMENT_TELLURIUM());
		$result->registerBlock("element_53", fn() => Blocks::ELEMENT_IODINE());
		$result->registerBlock("element_54", fn() => Blocks::ELEMENT_XENON());
		$result->registerBlock("element_55", fn() => Blocks::ELEMENT_CESIUM());
		$result->registerBlock("element_56", fn() => Blocks::ELEMENT_BARIUM());
		$result->registerBlock("element_57", fn() => Blocks::ELEMENT_LANTHANUM());
		$result->registerBlock("element_58", fn() => Blocks::ELEMENT_CERIUM());
		$result->registerBlock("element_59", fn() => Blocks::ELEMENT_PRASEODYMIUM());
		$result->registerBlock("element_6", fn() => Blocks::ELEMENT_CARBON());
		$result->registerBlock("element_60", fn() => Blocks::ELEMENT_NEODYMIUM());
		$result->registerBlock("element_61", fn() => Blocks::ELEMENT_PROMETHIUM());
		$result->registerBlock("element_62", fn() => Blocks::ELEMENT_SAMARIUM());
		$result->registerBlock("element_63", fn() => Blocks::ELEMENT_EUROPIUM());
		$result->registerBlock("element_64", fn() => Blocks::ELEMENT_GADOLINIUM());
		$result->registerBlock("element_65", fn() => Blocks::ELEMENT_TERBIUM());
		$result->registerBlock("element_66", fn() => Blocks::ELEMENT_DYSPROSIUM());
		$result->registerBlock("element_67", fn() => Blocks::ELEMENT_HOLMIUM());
		$result->registerBlock("element_68", fn() => Blocks::ELEMENT_ERBIUM());
		$result->registerBlock("element_69", fn() => Blocks::ELEMENT_THULIUM());
		$result->registerBlock("element_7", fn() => Blocks::ELEMENT_NITROGEN());
		$result->registerBlock("element_70", fn() => Blocks::ELEMENT_YTTERBIUM());
		$result->registerBlock("element_71", fn() => Blocks::ELEMENT_LUTETIUM());
		$result->registerBlock("element_72", fn() => Blocks::ELEMENT_HAFNIUM());
		$result->registerBlock("element_73", fn() => Blocks::ELEMENT_TANTALUM());
		$result->registerBlock("element_74", fn() => Blocks::ELEMENT_TUNGSTEN());
		$result->registerBlock("element_75", fn() => Blocks::ELEMENT_RHENIUM());
		$result->registerBlock("element_76", fn() => Blocks::ELEMENT_OSMIUM());
		$result->registerBlock("element_77", fn() => Blocks::ELEMENT_IRIDIUM());
		$result->registerBlock("element_78", fn() => Blocks::ELEMENT_PLATINUM());
		$result->registerBlock("element_79", fn() => Blocks::ELEMENT_GOLD());
		$result->registerBlock("element_8", fn() => Blocks::ELEMENT_OXYGEN());
		$result->registerBlock("element_80", fn() => Blocks::ELEMENT_MERCURY());
		$result->registerBlock("element_81", fn() => Blocks::ELEMENT_THALLIUM());
		$result->registerBlock("element_82", fn() => Blocks::ELEMENT_LEAD());
		$result->registerBlock("element_83", fn() => Blocks::ELEMENT_BISMUTH());
		$result->registerBlock("element_84", fn() => Blocks::ELEMENT_POLONIUM());
		$result->registerBlock("element_85", fn() => Blocks::ELEMENT_ASTATINE());
		$result->registerBlock("element_86", fn() => Blocks::ELEMENT_RADON());
		$result->registerBlock("element_87", fn() => Blocks::ELEMENT_FRANCIUM());
		$result->registerBlock("element_88", fn() => Blocks::ELEMENT_RADIUM());
		$result->registerBlock("element_89", fn() => Blocks::ELEMENT_ACTINIUM());
		$result->registerBlock("element_9", fn() => Blocks::ELEMENT_FLUORINE());
		$result->registerBlock("element_90", fn() => Blocks::ELEMENT_THORIUM());
		$result->registerBlock("element_91", fn() => Blocks::ELEMENT_PROTACTINIUM());
		$result->registerBlock("element_92", fn() => Blocks::ELEMENT_URANIUM());
		$result->registerBlock("element_93", fn() => Blocks::ELEMENT_NEPTUNIUM());
		$result->registerBlock("element_94", fn() => Blocks::ELEMENT_PLUTONIUM());
		$result->registerBlock("element_95", fn() => Blocks::ELEMENT_AMERICIUM());
		$result->registerBlock("element_96", fn() => Blocks::ELEMENT_CURIUM());
		$result->registerBlock("element_97", fn() => Blocks::ELEMENT_BERKELIUM());
		$result->registerBlock("element_98", fn() => Blocks::ELEMENT_CALIFORNIUM());
		$result->registerBlock("element_99", fn() => Blocks::ELEMENT_EINSTEINIUM());
		$result->registerBlock("element_actinium", fn() => Blocks::ELEMENT_ACTINIUM());
		$result->registerBlock("element_aluminum", fn() => Blocks::ELEMENT_ALUMINUM());
		$result->registerBlock("element_americium", fn() => Blocks::ELEMENT_AMERICIUM());
		$result->registerBlock("element_antimony", fn() => Blocks::ELEMENT_ANTIMONY());
		$result->registerBlock("element_argon", fn() => Blocks::ELEMENT_ARGON());
		$result->registerBlock("element_arsenic", fn() => Blocks::ELEMENT_ARSENIC());
		$result->registerBlock("element_astatine", fn() => Blocks::ELEMENT_ASTATINE());
		$result->registerBlock("element_barium", fn() => Blocks::ELEMENT_BARIUM());
		$result->registerBlock("element_berkelium", fn() => Blocks::ELEMENT_BERKELIUM());
		$result->registerBlock("element_beryllium", fn() => Blocks::ELEMENT_BERYLLIUM());
		$result->registerBlock("element_bismuth", fn() => Blocks::ELEMENT_BISMUTH());
		$result->registerBlock("element_bohrium", fn() => Blocks::ELEMENT_BOHRIUM());
		$result->registerBlock("element_boron", fn() => Blocks::ELEMENT_BORON());
		$result->registerBlock("element_bromine", fn() => Blocks::ELEMENT_BROMINE());
		$result->registerBlock("element_cadmium", fn() => Blocks::ELEMENT_CADMIUM());
		$result->registerBlock("element_calcium", fn() => Blocks::ELEMENT_CALCIUM());
		$result->registerBlock("element_californium", fn() => Blocks::ELEMENT_CALIFORNIUM());
		$result->registerBlock("element_carbon", fn() => Blocks::ELEMENT_CARBON());
		$result->registerBlock("element_cerium", fn() => Blocks::ELEMENT_CERIUM());
		$result->registerBlock("element_cesium", fn() => Blocks::ELEMENT_CESIUM());
		$result->registerBlock("element_chlorine", fn() => Blocks::ELEMENT_CHLORINE());
		$result->registerBlock("element_chromium", fn() => Blocks::ELEMENT_CHROMIUM());
		$result->registerBlock("element_cobalt", fn() => Blocks::ELEMENT_COBALT());
		$result->registerBlock("element_constructor", fn() => Blocks::ELEMENT_CONSTRUCTOR());
		$result->registerBlock("element_copernicium", fn() => Blocks::ELEMENT_COPERNICIUM());
		$result->registerBlock("element_copper", fn() => Blocks::ELEMENT_COPPER());
		$result->registerBlock("element_curium", fn() => Blocks::ELEMENT_CURIUM());
		$result->registerBlock("element_darmstadtium", fn() => Blocks::ELEMENT_DARMSTADTIUM());
		$result->registerBlock("element_dubnium", fn() => Blocks::ELEMENT_DUBNIUM());
		$result->registerBlock("element_dysprosium", fn() => Blocks::ELEMENT_DYSPROSIUM());
		$result->registerBlock("element_einsteinium", fn() => Blocks::ELEMENT_EINSTEINIUM());
		$result->registerBlock("element_erbium", fn() => Blocks::ELEMENT_ERBIUM());
		$result->registerBlock("element_europium", fn() => Blocks::ELEMENT_EUROPIUM());
		$result->registerBlock("element_fermium", fn() => Blocks::ELEMENT_FERMIUM());
		$result->registerBlock("element_flerovium", fn() => Blocks::ELEMENT_FLEROVIUM());
		$result->registerBlock("element_fluorine", fn() => Blocks::ELEMENT_FLUORINE());
		$result->registerBlock("element_francium", fn() => Blocks::ELEMENT_FRANCIUM());
		$result->registerBlock("element_gadolinium", fn() => Blocks::ELEMENT_GADOLINIUM());
		$result->registerBlock("element_gallium", fn() => Blocks::ELEMENT_GALLIUM());
		$result->registerBlock("element_germanium", fn() => Blocks::ELEMENT_GERMANIUM());
		$result->registerBlock("element_gold", fn() => Blocks::ELEMENT_GOLD());
		$result->registerBlock("element_hafnium", fn() => Blocks::ELEMENT_HAFNIUM());
		$result->registerBlock("element_hassium", fn() => Blocks::ELEMENT_HASSIUM());
		$result->registerBlock("element_helium", fn() => Blocks::ELEMENT_HELIUM());
		$result->registerBlock("element_holmium", fn() => Blocks::ELEMENT_HOLMIUM());
		$result->registerBlock("element_hydrogen", fn() => Blocks::ELEMENT_HYDROGEN());
		$result->registerBlock("element_indium", fn() => Blocks::ELEMENT_INDIUM());
		$result->registerBlock("element_iodine", fn() => Blocks::ELEMENT_IODINE());
		$result->registerBlock("element_iridium", fn() => Blocks::ELEMENT_IRIDIUM());
		$result->registerBlock("element_iron", fn() => Blocks::ELEMENT_IRON());
		$result->registerBlock("element_krypton", fn() => Blocks::ELEMENT_KRYPTON());
		$result->registerBlock("element_lanthanum", fn() => Blocks::ELEMENT_LANTHANUM());
		$result->registerBlock("element_lawrencium", fn() => Blocks::ELEMENT_LAWRENCIUM());
		$result->registerBlock("element_lead", fn() => Blocks::ELEMENT_LEAD());
		$result->registerBlock("element_lithium", fn() => Blocks::ELEMENT_LITHIUM());
		$result->registerBlock("element_livermorium", fn() => Blocks::ELEMENT_LIVERMORIUM());
		$result->registerBlock("element_lutetium", fn() => Blocks::ELEMENT_LUTETIUM());
		$result->registerBlock("element_magnesium", fn() => Blocks::ELEMENT_MAGNESIUM());
		$result->registerBlock("element_manganese", fn() => Blocks::ELEMENT_MANGANESE());
		$result->registerBlock("element_meitnerium", fn() => Blocks::ELEMENT_MEITNERIUM());
		$result->registerBlock("element_mendelevium", fn() => Blocks::ELEMENT_MENDELEVIUM());
		$result->registerBlock("element_mercury", fn() => Blocks::ELEMENT_MERCURY());
		$result->registerBlock("element_molybdenum", fn() => Blocks::ELEMENT_MOLYBDENUM());
		$result->registerBlock("element_moscovium", fn() => Blocks::ELEMENT_MOSCOVIUM());
		$result->registerBlock("element_neodymium", fn() => Blocks::ELEMENT_NEODYMIUM());
		$result->registerBlock("element_neon", fn() => Blocks::ELEMENT_NEON());
		$result->registerBlock("element_neptunium", fn() => Blocks::ELEMENT_NEPTUNIUM());
		$result->registerBlock("element_nickel", fn() => Blocks::ELEMENT_NICKEL());
		$result->registerBlock("element_nihonium", fn() => Blocks::ELEMENT_NIHONIUM());
		$result->registerBlock("element_niobium", fn() => Blocks::ELEMENT_NIOBIUM());
		$result->registerBlock("element_nitrogen", fn() => Blocks::ELEMENT_NITROGEN());
		$result->registerBlock("element_nobelium", fn() => Blocks::ELEMENT_NOBELIUM());
		$result->registerBlock("element_oganesson", fn() => Blocks::ELEMENT_OGANESSON());
		$result->registerBlock("element_osmium", fn() => Blocks::ELEMENT_OSMIUM());
		$result->registerBlock("element_oxygen", fn() => Blocks::ELEMENT_OXYGEN());
		$result->registerBlock("element_palladium", fn() => Blocks::ELEMENT_PALLADIUM());
		$result->registerBlock("element_phosphorus", fn() => Blocks::ELEMENT_PHOSPHORUS());
		$result->registerBlock("element_platinum", fn() => Blocks::ELEMENT_PLATINUM());
		$result->registerBlock("element_plutonium", fn() => Blocks::ELEMENT_PLUTONIUM());
		$result->registerBlock("element_polonium", fn() => Blocks::ELEMENT_POLONIUM());
		$result->registerBlock("element_potassium", fn() => Blocks::ELEMENT_POTASSIUM());
		$result->registerBlock("element_praseodymium", fn() => Blocks::ELEMENT_PRASEODYMIUM());
		$result->registerBlock("element_promethium", fn() => Blocks::ELEMENT_PROMETHIUM());
		$result->registerBlock("element_protactinium", fn() => Blocks::ELEMENT_PROTACTINIUM());
		$result->registerBlock("element_radium", fn() => Blocks::ELEMENT_RADIUM());
		$result->registerBlock("element_radon", fn() => Blocks::ELEMENT_RADON());
		$result->registerBlock("element_rhenium", fn() => Blocks::ELEMENT_RHENIUM());
		$result->registerBlock("element_rhodium", fn() => Blocks::ELEMENT_RHODIUM());
		$result->registerBlock("element_roentgenium", fn() => Blocks::ELEMENT_ROENTGENIUM());
		$result->registerBlock("element_rubidium", fn() => Blocks::ELEMENT_RUBIDIUM());
		$result->registerBlock("element_ruthenium", fn() => Blocks::ELEMENT_RUTHENIUM());
		$result->registerBlock("element_rutherfordium", fn() => Blocks::ELEMENT_RUTHERFORDIUM());
		$result->registerBlock("element_samarium", fn() => Blocks::ELEMENT_SAMARIUM());
		$result->registerBlock("element_scandium", fn() => Blocks::ELEMENT_SCANDIUM());
		$result->registerBlock("element_seaborgium", fn() => Blocks::ELEMENT_SEABORGIUM());
		$result->registerBlock("element_selenium", fn() => Blocks::ELEMENT_SELENIUM());
		$result->registerBlock("element_silicon", fn() => Blocks::ELEMENT_SILICON());
		$result->registerBlock("element_silver", fn() => Blocks::ELEMENT_SILVER());
		$result->registerBlock("element_sodium", fn() => Blocks::ELEMENT_SODIUM());
		$result->registerBlock("element_strontium", fn() => Blocks::ELEMENT_STRONTIUM());
		$result->registerBlock("element_sulfur", fn() => Blocks::ELEMENT_SULFUR());
		$result->registerBlock("element_tantalum", fn() => Blocks::ELEMENT_TANTALUM());
		$result->registerBlock("element_technetium", fn() => Blocks::ELEMENT_TECHNETIUM());
		$result->registerBlock("element_tellurium", fn() => Blocks::ELEMENT_TELLURIUM());
		$result->registerBlock("element_tennessine", fn() => Blocks::ELEMENT_TENNESSINE());
		$result->registerBlock("element_terbium", fn() => Blocks::ELEMENT_TERBIUM());
		$result->registerBlock("element_thallium", fn() => Blocks::ELEMENT_THALLIUM());
		$result->registerBlock("element_thorium", fn() => Blocks::ELEMENT_THORIUM());
		$result->registerBlock("element_thulium", fn() => Blocks::ELEMENT_THULIUM());
		$result->registerBlock("element_tin", fn() => Blocks::ELEMENT_TIN());
		$result->registerBlock("element_titanium", fn() => Blocks::ELEMENT_TITANIUM());
		$result->registerBlock("element_tungsten", fn() => Blocks::ELEMENT_TUNGSTEN());
		$result->registerBlock("element_uranium", fn() => Blocks::ELEMENT_URANIUM());
		$result->registerBlock("element_vanadium", fn() => Blocks::ELEMENT_VANADIUM());
		$result->registerBlock("element_xenon", fn() => Blocks::ELEMENT_XENON());
		$result->registerBlock("element_ytterbium", fn() => Blocks::ELEMENT_YTTERBIUM());
		$result->registerBlock("element_yttrium", fn() => Blocks::ELEMENT_YTTRIUM());
		$result->registerBlock("element_zero", fn() => Blocks::ELEMENT_ZERO());
		$result->registerBlock("element_zinc", fn() => Blocks::ELEMENT_ZINC());
		$result->registerBlock("element_zirconium", fn() => Blocks::ELEMENT_ZIRCONIUM());
		$result->registerBlock("emerald_block", fn() => Blocks::EMERALD());
		$result->registerBlock("emerald_ore", fn() => Blocks::EMERALD_ORE());
		$result->registerBlock("enchant_table", fn() => Blocks::ENCHANTING_TABLE());
		$result->registerBlock("enchanting_table", fn() => Blocks::ENCHANTING_TABLE());
		$result->registerBlock("enchantment_table", fn() => Blocks::ENCHANTING_TABLE());
		$result->registerBlock("end_brick_stairs", fn() => Blocks::END_STONE_BRICK_STAIRS());
		$result->registerBlock("end_bricks", fn() => Blocks::END_STONE_BRICKS());
		$result->registerBlock("end_portal_frame", fn() => Blocks::END_PORTAL_FRAME());
		$result->registerBlock("end_rod", fn() => Blocks::END_ROD());
		$result->registerBlock("end_stone", fn() => Blocks::END_STONE());
		$result->registerBlock("end_stone_brick_slab", fn() => Blocks::END_STONE_BRICK_SLAB());
		$result->registerBlock("end_stone_brick_stairs", fn() => Blocks::END_STONE_BRICK_STAIRS());
		$result->registerBlock("end_stone_brick_wall", fn() => Blocks::END_STONE_BRICK_WALL());
		$result->registerBlock("end_stone_bricks", fn() => Blocks::END_STONE_BRICKS());
		$result->registerBlock("ender_chest", fn() => Blocks::ENDER_CHEST());
		$result->registerBlock("fake_wooden_slab", fn() => Blocks::FAKE_WOODEN_SLAB());
		$result->registerBlock("farmland", fn() => Blocks::FARMLAND());
		$result->registerBlock("fence", fn() => Blocks::OAK_FENCE());
		$result->registerBlock("fence_gate", fn() => Blocks::OAK_FENCE_GATE());
		$result->registerBlock("fence_gate_acacia", fn() => Blocks::ACACIA_FENCE_GATE());
		$result->registerBlock("fence_gate_birch", fn() => Blocks::BIRCH_FENCE_GATE());
		$result->registerBlock("fence_gate_dark_oak", fn() => Blocks::DARK_OAK_FENCE_GATE());
		$result->registerBlock("fence_gate_jungle", fn() => Blocks::JUNGLE_FENCE_GATE());
		$result->registerBlock("fence_gate_spruce", fn() => Blocks::SPRUCE_FENCE_GATE());
		$result->registerBlock("fern", fn() => Blocks::FERN());
		$result->registerBlock("fire", fn() => Blocks::FIRE());
		$result->registerBlock("fletching_table", fn() => Blocks::FLETCHING_TABLE());
		$result->registerBlock("flower_pot", fn() => Blocks::FLOWER_POT());
		$result->registerBlock("flower_pot_block", fn() => Blocks::FLOWER_POT());
		$result->registerBlock("flowering_azalea_leaves", fn() => Blocks::FLOWERING_AZALEA_LEAVES());
		$result->registerBlock("flowing_lava", fn() => Blocks::LAVA());
		$result->registerBlock("flowing_water", fn() => Blocks::WATER());
		$result->registerBlock("frame", fn() => Blocks::ITEM_FRAME());
		$result->registerBlock("frame_block", fn() => Blocks::ITEM_FRAME());
		$result->registerBlock("frosted_ice", fn() => Blocks::FROSTED_ICE());
		$result->registerBlock("furnace", fn() => Blocks::FURNACE());
		$result->registerBlock("gilded_blackstone", fn() => Blocks::GILDED_BLACKSTONE());
		$result->registerBlock("glass", fn() => Blocks::GLASS());
		$result->registerBlock("glass_pane", fn() => Blocks::GLASS_PANE());
		$result->registerBlock("glass_panel", fn() => Blocks::GLASS_PANE());
		$result->registerBlock("glazed_terracotta", fn() => Blocks::GLAZED_TERRACOTTA());
		$result->registerBlock("glow_frame", fn() => Blocks::GLOWING_ITEM_FRAME());
		$result->registerBlock("glow_item_frame", fn() => Blocks::GLOWING_ITEM_FRAME());
		$result->registerBlock("glowing_item_frame", fn() => Blocks::GLOWING_ITEM_FRAME());
		$result->registerBlock("glowing_obsidian", fn() => Blocks::GLOWING_OBSIDIAN());
		$result->registerBlock("glowing_redstone_ore", fn() => Blocks::REDSTONE_ORE()->setLit(true));
		$result->registerBlock("glowingobsidian", fn() => Blocks::GLOWING_OBSIDIAN());
		$result->registerBlock("glowstone", fn() => Blocks::GLOWSTONE());
		$result->registerBlock("glowstone_block", fn() => Blocks::GLOWSTONE());
		$result->registerBlock("glow_lichen", fn() => Blocks::GLOW_LICHEN());
		$result->registerBlock("gold", fn() => Blocks::GOLD());
		$result->registerBlock("gold_block", fn() => Blocks::GOLD());
		$result->registerBlock("gold_ore", fn() => Blocks::GOLD_ORE());
		$result->registerBlock("gold_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT());
		$result->registerBlock("golden_rail", fn() => Blocks::POWERED_RAIL());
		$result->registerBlock("granite", fn() => Blocks::GRANITE());
		$result->registerBlock("granite_slab", fn() => Blocks::GRANITE_SLAB());
		$result->registerBlock("granite_stairs", fn() => Blocks::GRANITE_STAIRS());
		$result->registerBlock("granite_wall", fn() => Blocks::GRANITE_WALL());
		$result->registerBlock("grass", fn() => Blocks::GRASS());
		$result->registerBlock("grass_path", fn() => Blocks::GRASS_PATH());
		$result->registerBlock("gravel", fn() => Blocks::GRAVEL());
		$result->registerBlock("green_torch", fn() => Blocks::GREEN_TORCH());
		$result->registerBlock("hanging_roots", fn() => Blocks::HANGING_ROOTS());
		$result->registerBlock("hard_glass", fn() => Blocks::HARDENED_GLASS());
		$result->registerBlock("hard_glass_pane", fn() => Blocks::HARDENED_GLASS_PANE());
		$result->registerBlock("hard_stained_glass", fn() => Blocks::STAINED_HARDENED_GLASS());
		$result->registerBlock("hard_stained_glass_pane", fn() => Blocks::STAINED_HARDENED_GLASS_PANE());
		$result->registerBlock("hardened_clay", fn() => Blocks::HARDENED_CLAY());
		$result->registerBlock("hardened_glass", fn() => Blocks::HARDENED_GLASS());
		$result->registerBlock("hardened_glass_pane", fn() => Blocks::HARDENED_GLASS_PANE());
		$result->registerBlock("hay_bale", fn() => Blocks::HAY_BALE());
		$result->registerBlock("hay_block", fn() => Blocks::HAY_BALE());
		$result->registerBlock("heavy_weighted_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY());
		$result->registerBlock("honeycomb_block", fn() => Blocks::HONEYCOMB());
		$result->registerBlock("hopper", fn() => Blocks::HOPPER());
		$result->registerBlock("hopper_block", fn() => Blocks::HOPPER());
		$result->registerBlock("ice", fn() => Blocks::ICE());
		$result->registerBlock("inactive_redstone_lamp", fn() => Blocks::REDSTONE_LAMP());
		$result->registerBlock("infested_chiseled_stone_brick", fn() => Blocks::INFESTED_CHISELED_STONE_BRICK());
		$result->registerBlock("infested_cobblestone", fn() => Blocks::INFESTED_COBBLESTONE());
		$result->registerBlock("infested_cracked_stone_brick", fn() => Blocks::INFESTED_CRACKED_STONE_BRICK());
		$result->registerBlock("infested_mossy_stone_brick", fn() => Blocks::INFESTED_MOSSY_STONE_BRICK());
		$result->registerBlock("infested_stone", fn() => Blocks::INFESTED_STONE());
		$result->registerBlock("infested_stone_brick", fn() => Blocks::INFESTED_STONE_BRICK());
		$result->registerBlock("info_reserved6", fn() => Blocks::RESERVED6());
		$result->registerBlock("info_update", fn() => Blocks::INFO_UPDATE());
		$result->registerBlock("info_update2", fn() => Blocks::INFO_UPDATE2());
		$result->registerBlock("inverted_daylight_sensor", fn() => Blocks::DAYLIGHT_SENSOR()->setInverted(true));
		$result->registerBlock("invisible_bedrock", fn() => Blocks::INVISIBLE_BEDROCK());
		$result->registerBlock("invisiblebedrock", fn() => Blocks::INVISIBLE_BEDROCK());
		$result->registerBlock("iron", fn() => Blocks::IRON());
		$result->registerBlock("iron_bar", fn() => Blocks::IRON_BARS());
		$result->registerBlock("iron_bars", fn() => Blocks::IRON_BARS());
		$result->registerBlock("iron_block", fn() => Blocks::IRON());
		$result->registerBlock("iron_door", fn() => Blocks::IRON_DOOR());
		$result->registerBlock("iron_door_block", fn() => Blocks::IRON_DOOR());
		$result->registerBlock("iron_ore", fn() => Blocks::IRON_ORE());
		$result->registerBlock("iron_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY());
		$result->registerBlock("iron_trapdoor", fn() => Blocks::IRON_TRAPDOOR());
		$result->registerBlock("item_frame", fn() => Blocks::ITEM_FRAME());
		$result->registerBlock("item_frame_block", fn() => Blocks::ITEM_FRAME());
		$result->registerBlock("jack_o_lantern", fn() => Blocks::LIT_PUMPKIN());
		$result->registerBlock("jukebox", fn() => Blocks::JUKEBOX());
		$result->registerBlock("jungle_button", fn() => Blocks::JUNGLE_BUTTON());
		$result->registerBlock("jungle_door", fn() => Blocks::JUNGLE_DOOR());
		$result->registerBlock("jungle_door_block", fn() => Blocks::JUNGLE_DOOR());
		$result->registerBlock("jungle_fence", fn() => Blocks::JUNGLE_FENCE());
		$result->registerBlock("jungle_fence_gate", fn() => Blocks::JUNGLE_FENCE_GATE());
		$result->registerBlock("jungle_leaves", fn() => Blocks::JUNGLE_LEAVES());
		$result->registerBlock("jungle_log", fn() => Blocks::JUNGLE_LOG()->setStripped(false));
		$result->registerBlock("jungle_planks", fn() => Blocks::JUNGLE_PLANKS());
		$result->registerBlock("jungle_pressure_plate", fn() => Blocks::JUNGLE_PRESSURE_PLATE());
		$result->registerBlock("jungle_sapling", fn() => Blocks::JUNGLE_SAPLING());
		$result->registerBlock("jungle_sign", fn() => Blocks::JUNGLE_SIGN());
		$result->registerBlock("jungle_slab", fn() => Blocks::JUNGLE_SLAB());
		$result->registerBlock("jungle_stairs", fn() => Blocks::JUNGLE_STAIRS());
		$result->registerBlock("jungle_standing_sign", fn() => Blocks::JUNGLE_SIGN());
		$result->registerBlock("jungle_trapdoor", fn() => Blocks::JUNGLE_TRAPDOOR());
		$result->registerBlock("jungle_wall_sign", fn() => Blocks::JUNGLE_WALL_SIGN());
		$result->registerBlock("jungle_wood", fn() => Blocks::JUNGLE_WOOD()->setStripped(false));
		$result->registerBlock("jungle_wood_stairs", fn() => Blocks::JUNGLE_STAIRS());
		$result->registerBlock("jungle_wooden_stairs", fn() => Blocks::JUNGLE_STAIRS());
		$result->registerBlock("lab_table", fn() => Blocks::LAB_TABLE());
		$result->registerBlock("ladder", fn() => Blocks::LADDER());
		$result->registerBlock("lantern", fn() => Blocks::LANTERN());
		$result->registerBlock("lapis_block", fn() => Blocks::LAPIS_LAZULI());
		$result->registerBlock("lapis_lazuli_block", fn() => Blocks::LAPIS_LAZULI());
		$result->registerBlock("lapis_lazuli_ore", fn() => Blocks::LAPIS_LAZULI_ORE());
		$result->registerBlock("lapis_ore", fn() => Blocks::LAPIS_LAZULI_ORE());
		$result->registerBlock("large_amethyst_bud", fn() => Blocks::AMETHYST_CLUSTER()->setStage(AmethystCluster::STAGE_LARGE_BUD));
		$result->registerBlock("large_fern", fn() => Blocks::LARGE_FERN());
		$result->registerBlock("lava", fn() => Blocks::LAVA());
		$result->registerBlock("leave", fn() => Blocks::OAK_LEAVES());
		$result->registerBlock("leave2", fn() => Blocks::ACACIA_LEAVES());
		$result->registerBlock("leaves", fn() => Blocks::OAK_LEAVES());
		$result->registerBlock("leaves2", fn() => Blocks::ACACIA_LEAVES());
		$result->registerBlock("lectern", fn() => Blocks::LECTERN());
		$result->registerBlock("legacy_stonecutter", fn() => Blocks::LEGACY_STONECUTTER());
		$result->registerBlock("lever", fn() => Blocks::LEVER());
		$result->registerBlock("light", fn() => Blocks::LIGHT());
		$result->registerBlock("light_block", fn() => Blocks::LIGHT());
		$result->registerBlock("light_weighted_pressure_plate", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT());
		$result->registerBlock("lilac", fn() => Blocks::LILAC());
		$result->registerBlock("lily_of_the_valley", fn() => Blocks::LILY_OF_THE_VALLEY());
		$result->registerBlock("lily_pad", fn() => Blocks::LILY_PAD());
		$result->registerBlock("lit_blast_furnace", fn() => Blocks::BLAST_FURNACE());
		$result->registerBlock("lit_furnace", fn() => Blocks::FURNACE());
		$result->registerBlock("lit_pumpkin", fn() => Blocks::LIT_PUMPKIN());
		$result->registerBlock("lit_redstone_lamp", fn() => Blocks::REDSTONE_LAMP()->setPowered(true));
		$result->registerBlock("lit_redstone_ore", fn() => Blocks::REDSTONE_ORE()->setLit(true));
		$result->registerBlock("lit_redstone_torch", fn() => Blocks::REDSTONE_TORCH());
		$result->registerBlock("lit_smoker", fn() => Blocks::SMOKER());
		$result->registerBlock("log", fn() => Blocks::OAK_LOG()->setStripped(false));
		$result->registerBlock("log2", fn() => Blocks::ACACIA_LOG()->setStripped(false));
		$result->registerBlock("loom", fn() => Blocks::LOOM());
		$result->registerBlock("magma", fn() => Blocks::MAGMA());
		$result->registerBlock("mangrove_button", fn() => Blocks::MANGROVE_BUTTON());
		$result->registerBlock("mangrove_door", fn() => Blocks::MANGROVE_DOOR());
		$result->registerBlock("mangrove_fence", fn() => Blocks::MANGROVE_FENCE());
		$result->registerBlock("mangrove_fence_gate", fn() => Blocks::MANGROVE_FENCE_GATE());
		$result->registerBlock("mangrove_leaves", fn() => Blocks::MANGROVE_LEAVES());
		$result->registerBlock("mangrove_log", fn() => Blocks::MANGROVE_LOG()->setStripped(false));
		$result->registerBlock("mangrove_planks", fn() => Blocks::MANGROVE_PLANKS());
		$result->registerBlock("mangrove_pressure_plate", fn() => Blocks::MANGROVE_PRESSURE_PLATE());
		$result->registerBlock("mangrove_roots", fn() => Blocks::MANGROVE_ROOTS());
		$result->registerBlock("mangrove_sign", fn() => Blocks::MANGROVE_SIGN());
		$result->registerBlock("mangrove_slab", fn() => Blocks::MANGROVE_SLAB());
		$result->registerBlock("mangrove_stairs", fn() => Blocks::MANGROVE_STAIRS());
		$result->registerBlock("mangrove_trapdoor", fn() => Blocks::MANGROVE_TRAPDOOR());
		$result->registerBlock("mangrove_wood", fn() => Blocks::MANGROVE_WOOD()->setStripped(false));
		$result->registerBlock("material_reducer", fn() => Blocks::MATERIAL_REDUCER());
		$result->registerBlock("medium_amethyst_bud", fn() => Blocks::AMETHYST_CLUSTER()->setStage(AmethystCluster::STAGE_MEDIUM_BUD));
		$result->registerBlock("melon_block", fn() => Blocks::MELON());
		$result->registerBlock("melon_stem", fn() => Blocks::MELON_STEM());
		$result->registerBlock("mob_head", fn() => Blocks::MOB_HEAD());
		$result->registerBlock("mob_head_block", fn() => Blocks::MOB_HEAD());
		$result->registerBlock("mob_spawner", fn() => Blocks::MONSTER_SPAWNER());
		$result->registerBlock("monster_egg", fn() => Blocks::INFESTED_STONE());
		$result->registerBlock("monster_egg_block", fn() => Blocks::INFESTED_STONE());
		$result->registerBlock("monster_spawner", fn() => Blocks::MONSTER_SPAWNER());
		$result->registerBlock("moss_stone", fn() => Blocks::MOSSY_COBBLESTONE());
		$result->registerBlock("mossy_cobblestone", fn() => Blocks::MOSSY_COBBLESTONE());
		$result->registerBlock("mossy_cobblestone_slab", fn() => Blocks::MOSSY_COBBLESTONE_SLAB());
		$result->registerBlock("mossy_cobblestone_stairs", fn() => Blocks::MOSSY_COBBLESTONE_STAIRS());
		$result->registerBlock("mossy_cobblestone_wall", fn() => Blocks::MOSSY_COBBLESTONE_WALL());
		$result->registerBlock("mossy_stone", fn() => Blocks::MOSSY_COBBLESTONE());
		$result->registerBlock("mossy_stone_brick_slab", fn() => Blocks::MOSSY_STONE_BRICK_SLAB());
		$result->registerBlock("mossy_stone_brick_stairs", fn() => Blocks::MOSSY_STONE_BRICK_STAIRS());
		$result->registerBlock("mossy_stone_brick_wall", fn() => Blocks::MOSSY_STONE_BRICK_WALL());
		$result->registerBlock("mossy_stone_bricks", fn() => Blocks::MOSSY_STONE_BRICKS());
		$result->registerBlock("mud", fn() => Blocks::MUD());
		$result->registerBlock("mud_bricks", fn() => Blocks::MUD_BRICKS());
		$result->registerBlock("mud_brick_slab", fn() => Blocks::MUD_BRICK_SLAB());
		$result->registerBlock("mud_brick_stairs", fn() => Blocks::MUD_BRICK_STAIRS());
		$result->registerBlock("mud_brick_wall", fn() => Blocks::MUD_BRICK_WALL());
		$result->registerBlock("muddy_mangrove_roots", fn() => Blocks::MUDDY_MANGROVE_ROOTS());
		$result->registerBlock("mushroom_stem", fn() => Blocks::MUSHROOM_STEM());
		$result->registerBlock("mycelium", fn() => Blocks::MYCELIUM());
		$result->registerBlock("nether_brick_block", fn() => Blocks::NETHER_BRICKS());
		$result->registerBlock("nether_brick_fence", fn() => Blocks::NETHER_BRICK_FENCE());
		$result->registerBlock("nether_brick_slab", fn() => Blocks::NETHER_BRICK_SLAB());
		$result->registerBlock("nether_brick_stairs", fn() => Blocks::NETHER_BRICK_STAIRS());
		$result->registerBlock("nether_brick_wall", fn() => Blocks::NETHER_BRICK_WALL());
		$result->registerBlock("nether_bricks", fn() => Blocks::NETHER_BRICKS());
		$result->registerBlock("nether_bricks_stairs", fn() => Blocks::NETHER_BRICK_STAIRS());
		$result->registerBlock("nether_gold_ore", fn() => Blocks::NETHER_GOLD_ORE());
		$result->registerBlock("nether_portal", fn() => Blocks::NETHER_PORTAL());
		$result->registerBlock("nether_quartz_ore", fn() => Blocks::NETHER_QUARTZ_ORE());
		$result->registerBlock("nether_reactor", fn() => Blocks::NETHER_REACTOR_CORE());
		$result->registerBlock("nether_reactor_core", fn() => Blocks::NETHER_REACTOR_CORE());
		$result->registerBlock("nether_wart", fn() => Blocks::NETHER_WART());
		$result->registerBlock("nether_wart_block", fn() => Blocks::NETHER_WART_BLOCK());
		$result->registerBlock("nether_wart_plant", fn() => Blocks::NETHER_WART());
		$result->registerBlock("netherite_block", fn() => Blocks::NETHERITE());
		$result->registerBlock("netherrack", fn() => Blocks::NETHERRACK());
		$result->registerBlock("netherreactor", fn() => Blocks::NETHER_REACTOR_CORE());
		$result->registerBlock("normal_stone_stairs", fn() => Blocks::STONE_STAIRS());
		$result->registerBlock("note_block", fn() => Blocks::NOTE_BLOCK());
		$result->registerBlock("noteblock", fn() => Blocks::NOTE_BLOCK());
		$result->registerBlock("oak_button", fn() => Blocks::OAK_BUTTON());
		$result->registerBlock("oak_door", fn() => Blocks::OAK_DOOR());
		$result->registerBlock("oak_door_block", fn() => Blocks::OAK_DOOR());
		$result->registerBlock("oak_fence", fn() => Blocks::OAK_FENCE());
		$result->registerBlock("oak_fence_gate", fn() => Blocks::OAK_FENCE_GATE());
		$result->registerBlock("oak_leaves", fn() => Blocks::OAK_LEAVES());
		$result->registerBlock("oak_log", fn() => Blocks::OAK_LOG()->setStripped(false));
		$result->registerBlock("oak_planks", fn() => Blocks::OAK_PLANKS());
		$result->registerBlock("oak_pressure_plate", fn() => Blocks::OAK_PRESSURE_PLATE());
		$result->registerBlock("oak_sapling", fn() => Blocks::OAK_SAPLING());
		$result->registerBlock("oak_sign", fn() => Blocks::OAK_SIGN());
		$result->registerBlock("oak_slab", fn() => Blocks::OAK_SLAB());
		$result->registerBlock("oak_stairs", fn() => Blocks::OAK_STAIRS());
		$result->registerBlock("oak_standing_sign", fn() => Blocks::OAK_SIGN());
		$result->registerBlock("oak_trapdoor", fn() => Blocks::OAK_TRAPDOOR());
		$result->registerBlock("oak_wall_sign", fn() => Blocks::OAK_WALL_SIGN());
		$result->registerBlock("oak_wood", fn() => Blocks::OAK_WOOD()->setStripped(false));
		$result->registerBlock("oak_wood_stairs", fn() => Blocks::OAK_STAIRS());
		$result->registerBlock("oak_wooden_stairs", fn() => Blocks::OAK_STAIRS());
		$result->registerBlock("obsidian", fn() => Blocks::OBSIDIAN());
		$result->registerBlock("orange_tulip", fn() => Blocks::ORANGE_TULIP());
		$result->registerBlock("oxeye_daisy", fn() => Blocks::OXEYE_DAISY());
		$result->registerBlock("packed_ice", fn() => Blocks::PACKED_ICE());
		$result->registerBlock("packed_mud", fn() => Blocks::PACKED_MUD());
		$result->registerBlock("pale_oak_button", fn() => Blocks::PALE_OAK_BUTTON());
		$result->registerBlock("pale_oak_door", fn() => Blocks::PALE_OAK_DOOR());
		$result->registerBlock("pale_oak_fence", fn() => Blocks::PALE_OAK_FENCE());
		$result->registerBlock("pale_oak_fence_gate", fn() => Blocks::PALE_OAK_FENCE_GATE());
		$result->registerBlock("pale_oak_leaves", fn() => Blocks::PALE_OAK_LEAVES());
		$result->registerBlock("pale_oak_log", fn() => Blocks::PALE_OAK_LOG()->setStripped(false));
		$result->registerBlock("pale_oak_planks", fn() => Blocks::PALE_OAK_PLANKS());
		$result->registerBlock("pale_oak_pressure_plate", fn() => Blocks::PALE_OAK_PRESSURE_PLATE());
		$result->registerBlock("pale_oak_sign", fn() => Blocks::PALE_OAK_SIGN());
		$result->registerBlock("pale_oak_slab", fn() => Blocks::PALE_OAK_SLAB());
		$result->registerBlock("pale_oak_stairs", fn() => Blocks::PALE_OAK_STAIRS());
		$result->registerBlock("pale_oak_trapdoor", fn() => Blocks::PALE_OAK_TRAPDOOR());
		$result->registerBlock("pale_oak_wood", fn() => Blocks::PALE_OAK_WOOD()->setStripped(false));
		$result->registerBlock("peony", fn() => Blocks::PEONY());
		$result->registerBlock("pink_petals", fn() => Blocks::PINK_PETALS());
		$result->registerBlock("pink_tulip", fn() => Blocks::PINK_TULIP());
		$result->registerBlock("piglin_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PIGLIN));
		$result->registerBlock("pitcher_plant", fn() => Blocks::PITCHER_PLANT());
		$result->registerBlock("plank", fn() => Blocks::OAK_PLANKS());
		$result->registerBlock("planks", fn() => Blocks::OAK_PLANKS());
		$result->registerBlock("player_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::PLAYER));
		$result->registerBlock("podzol", fn() => Blocks::PODZOL());
		$result->registerBlock("polished_andesite", fn() => Blocks::POLISHED_ANDESITE());
		$result->registerBlock("polished_andesite_slab", fn() => Blocks::POLISHED_ANDESITE_SLAB());
		$result->registerBlock("polished_andesite_stairs", fn() => Blocks::POLISHED_ANDESITE_STAIRS());
		$result->registerBlock("polished_basalt", fn() => Blocks::POLISHED_BASALT());
		$result->registerBlock("polished_blackstone", fn() => Blocks::POLISHED_BLACKSTONE());
		$result->registerBlock("polished_blackstone_brick_slab", fn() => Blocks::POLISHED_BLACKSTONE_BRICK_SLAB());
		$result->registerBlock("polished_blackstone_brick_stairs", fn() => Blocks::POLISHED_BLACKSTONE_BRICK_STAIRS());
		$result->registerBlock("polished_blackstone_brick_wall", fn() => Blocks::POLISHED_BLACKSTONE_BRICK_WALL());
		$result->registerBlock("polished_blackstone_bricks", fn() => Blocks::POLISHED_BLACKSTONE_BRICKS());
		$result->registerBlock("polished_blackstone_button", fn() => Blocks::POLISHED_BLACKSTONE_BUTTON());
		$result->registerBlock("polished_blackstone_pressure_plate", fn() => Blocks::POLISHED_BLACKSTONE_PRESSURE_PLATE());
		$result->registerBlock("polished_blackstone_slab", fn() => Blocks::POLISHED_BLACKSTONE_SLAB());
		$result->registerBlock("polished_blackstone_stairs", fn() => Blocks::POLISHED_BLACKSTONE_STAIRS());
		$result->registerBlock("polished_blackstone_wall", fn() => Blocks::POLISHED_BLACKSTONE_WALL());
		$result->registerBlock("polished_deepslate", fn() => Blocks::POLISHED_DEEPSLATE());
		$result->registerBlock("polished_deepslate_slab", fn() => Blocks::POLISHED_DEEPSLATE_SLAB());
		$result->registerBlock("polished_deepslate_stairs", fn() => Blocks::POLISHED_DEEPSLATE_STAIRS());
		$result->registerBlock("polished_deepslate_wall", fn() => Blocks::POLISHED_DEEPSLATE_WALL());
		$result->registerBlock("polished_diorite", fn() => Blocks::POLISHED_DIORITE());
		$result->registerBlock("polished_diorite_slab", fn() => Blocks::POLISHED_DIORITE_SLAB());
		$result->registerBlock("polished_diorite_stairs", fn() => Blocks::POLISHED_DIORITE_STAIRS());
		$result->registerBlock("polished_granite", fn() => Blocks::POLISHED_GRANITE());
		$result->registerBlock("polished_granite_slab", fn() => Blocks::POLISHED_GRANITE_SLAB());
		$result->registerBlock("polished_granite_stairs", fn() => Blocks::POLISHED_GRANITE_STAIRS());
		$result->registerBlock("polished_tuff", fn() => Blocks::POLISHED_TUFF());
		$result->registerBlock("polished_tuff_slab", fn() => Blocks::POLISHED_TUFF_SLAB());
		$result->registerBlock("polished_tuff_stairs", fn() => Blocks::POLISHED_TUFF_STAIRS());
		$result->registerBlock("polished_tuff_wall", fn() => Blocks::POLISHED_TUFF_WALL());
		$result->registerBlock("poppy", fn() => Blocks::POPPY());
		$result->registerBlock("portal", fn() => Blocks::NETHER_PORTAL());
		$result->registerBlock("portal_block", fn() => Blocks::NETHER_PORTAL());
		$result->registerBlock("potato_block", fn() => Blocks::POTATOES());
		$result->registerBlock("potatoes", fn() => Blocks::POTATOES());
		$result->registerBlock("powered_comparator", fn() => Blocks::REDSTONE_COMPARATOR());
		$result->registerBlock("powered_comparator_block", fn() => Blocks::REDSTONE_COMPARATOR());
		$result->registerBlock("powered_rail", fn() => Blocks::POWERED_RAIL());
		$result->registerBlock("powered_repeater", fn() => Blocks::REDSTONE_REPEATER()->setPowered(true));
		$result->registerBlock("powered_repeater_block", fn() => Blocks::REDSTONE_REPEATER()->setPowered(true));
		$result->registerBlock("prismarine", fn() => Blocks::PRISMARINE());
		$result->registerBlock("prismarine_bricks", fn() => Blocks::PRISMARINE_BRICKS());
		$result->registerBlock("prismarine_bricks_slab", fn() => Blocks::PRISMARINE_BRICKS_SLAB());
		$result->registerBlock("prismarine_bricks_stairs", fn() => Blocks::PRISMARINE_BRICKS_STAIRS());
		$result->registerBlock("prismarine_slab", fn() => Blocks::PRISMARINE_SLAB());
		$result->registerBlock("prismarine_stairs", fn() => Blocks::PRISMARINE_STAIRS());
		$result->registerBlock("prismarine_wall", fn() => Blocks::PRISMARINE_WALL());
		$result->registerBlock("pumpkin", fn() => Blocks::PUMPKIN());
		$result->registerBlock("pumpkin_stem", fn() => Blocks::PUMPKIN_STEM());
		$result->registerBlock("purple_torch", fn() => Blocks::PURPLE_TORCH());
		$result->registerBlock("purpur", fn() => Blocks::PURPUR());
		$result->registerBlock("purpur_block", fn() => Blocks::PURPUR());
		$result->registerBlock("purpur_pillar", fn() => Blocks::PURPUR_PILLAR());
		$result->registerBlock("purpur_slab", fn() => Blocks::PURPUR_SLAB());
		$result->registerBlock("purpur_stairs", fn() => Blocks::PURPUR_STAIRS());
		$result->registerBlock("quartz_block", fn() => Blocks::QUARTZ());
		$result->registerBlock("quartz_bricks", fn() => Blocks::QUARTZ_BRICKS());
		$result->registerBlock("quartz_ore", fn() => Blocks::NETHER_QUARTZ_ORE());
		$result->registerBlock("quartz_pillar", fn() => Blocks::QUARTZ_PILLAR());
		$result->registerBlock("quartz_slab", fn() => Blocks::QUARTZ_SLAB());
		$result->registerBlock("quartz_stairs", fn() => Blocks::QUARTZ_STAIRS());
		$result->registerBlock("rail", fn() => Blocks::RAIL());
		$result->registerBlock("raw_copper_block", fn() => Blocks::RAW_COPPER());
		$result->registerBlock("raw_gold_block", fn() => Blocks::RAW_GOLD());
		$result->registerBlock("raw_iron_block", fn() => Blocks::RAW_IRON());
		$result->registerBlock("red_flower", fn() => Blocks::POPPY());
		$result->registerBlock("red_mushroom", fn() => Blocks::RED_MUSHROOM());
		$result->registerBlock("red_mushroom_block", fn() => Blocks::RED_MUSHROOM_BLOCK());
		$result->registerBlock("red_nether_brick", fn() => Blocks::RED_NETHER_BRICKS());
		$result->registerBlock("red_nether_brick_slab", fn() => Blocks::RED_NETHER_BRICK_SLAB());
		$result->registerBlock("red_nether_brick_stairs", fn() => Blocks::RED_NETHER_BRICK_STAIRS());
		$result->registerBlock("red_nether_brick_wall", fn() => Blocks::RED_NETHER_BRICK_WALL());
		$result->registerBlock("red_nether_bricks", fn() => Blocks::RED_NETHER_BRICKS());
		$result->registerBlock("red_sand", fn() => Blocks::RED_SAND());
		$result->registerBlock("red_sandstone", fn() => Blocks::RED_SANDSTONE());
		$result->registerBlock("red_sandstone_slab", fn() => Blocks::RED_SANDSTONE_SLAB());
		$result->registerBlock("red_sandstone_stairs", fn() => Blocks::RED_SANDSTONE_STAIRS());
		$result->registerBlock("red_sandstone_wall", fn() => Blocks::RED_SANDSTONE_WALL());
		$result->registerBlock("red_torch", fn() => Blocks::RED_TORCH());
		$result->registerBlock("red_tulip", fn() => Blocks::RED_TULIP());
		$result->registerBlock("redstone_block", fn() => Blocks::REDSTONE());
		$result->registerBlock("redstone_comparator", fn() => Blocks::REDSTONE_COMPARATOR());
		$result->registerBlock("redstone_lamp", fn() => Blocks::REDSTONE_LAMP());
		$result->registerBlock("redstone_ore", fn() => Blocks::REDSTONE_ORE());
		$result->registerBlock("redstone_repeater", fn() => Blocks::REDSTONE_REPEATER());
		$result->registerBlock("redstone_torch", fn() => Blocks::REDSTONE_TORCH());
		$result->registerBlock("redstone_wire", fn() => Blocks::REDSTONE_WIRE());
		$result->registerBlock("reeds", fn() => Blocks::SUGARCANE());
		$result->registerBlock("reeds_block", fn() => Blocks::SUGARCANE());
		$result->registerBlock("reinforced_deepslate", fn() => Blocks::REINFORCED_DEEPSLATE());
		$result->registerBlock("repeater", fn() => Blocks::REDSTONE_REPEATER());
		$result->registerBlock("repeater_block", fn() => Blocks::REDSTONE_REPEATER());
		$result->registerBlock("reserved6", fn() => Blocks::RESERVED6());
		$result->registerBlock("resin", fn() => Blocks::RESIN());
		$result->registerBlock("resin_block", fn() => Blocks::RESIN());
		$result->registerBlock("resin_brick_slab", fn() => Blocks::RESIN_BRICK_SLAB());
		$result->registerBlock("resin_brick_stairs", fn() => Blocks::RESIN_BRICK_STAIRS());
		$result->registerBlock("resin_brick_wall", fn() => Blocks::RESIN_BRICK_WALL());
		$result->registerBlock("resin_bricks", fn() => Blocks::RESIN_BRICKS());
		$result->registerBlock("resin_clump", fn() => Blocks::RESIN_CLUMP());
		$result->registerBlock("respawn_anchor", fn() => Blocks::RESPAWN_ANCHOR());
		$result->registerBlock("rooted_dirt", fn() => Blocks::DIRT()->setDirtType(DirtType::ROOTED));
		$result->registerBlock("rose", fn() => Blocks::POPPY());
		$result->registerBlock("rose_bush", fn() => Blocks::ROSE_BUSH());
		$result->registerBlock("sand", fn() => Blocks::SAND());
		$result->registerBlock("sandstone", fn() => Blocks::SANDSTONE());
		$result->registerBlock("sandstone_slab", fn() => Blocks::SANDSTONE_SLAB());
		$result->registerBlock("sandstone_stairs", fn() => Blocks::SANDSTONE_STAIRS());
		$result->registerBlock("sandstone_wall", fn() => Blocks::SANDSTONE_WALL());
		$result->registerBlock("sapling", fn() => Blocks::OAK_SAPLING());
		$result->registerBlock("sculk", fn() => Blocks::SCULK());
		$result->registerBlock("sea_lantern", fn() => Blocks::SEA_LANTERN());
		$result->registerBlock("sea_pickle", fn() => Blocks::SEA_PICKLE());
		$result->registerBlock("sealantern", fn() => Blocks::SEA_LANTERN());
		$result->registerBlock("shroomlight", fn() => Blocks::SHROOMLIGHT());
		$result->registerBlock("shulker_box", fn() => Blocks::SHULKER_BOX());
		$result->registerBlock("sign", fn() => Blocks::OAK_SIGN());
		$result->registerBlock("sign_post", fn() => Blocks::OAK_SIGN());
		$result->registerBlock("skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON));
		$result->registerBlock("skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::SKELETON));
		$result->registerBlock("skull_block", fn() => Blocks::MOB_HEAD());
		$result->registerBlock("slab", fn() => Blocks::SMOOTH_STONE_SLAB());
		$result->registerBlock("slabs", fn() => Blocks::SMOOTH_STONE_SLAB());
		$result->registerBlock("slime", fn() => Blocks::SLIME());
		$result->registerBlock("slime_block", fn() => Blocks::SLIME());
		$result->registerBlock("small_amethyst_bud", fn() => Blocks::AMETHYST_CLUSTER()->setStage(AmethystCluster::STAGE_SMALL_BUD));
		$result->registerBlock("small_dripleaf", fn() => Blocks::SMALL_DRIPLEAF());
		$result->registerBlock("smithing_table", fn() => Blocks::SMITHING_TABLE());
		$result->registerBlock("smoker", fn() => Blocks::SMOKER());
		$result->registerBlock("smooth_basalt", fn() => Blocks::SMOOTH_BASALT());
		$result->registerBlock("smooth_quartz", fn() => Blocks::SMOOTH_QUARTZ());
		$result->registerBlock("smooth_quartz_slab", fn() => Blocks::SMOOTH_QUARTZ_SLAB());
		$result->registerBlock("smooth_quartz_stairs", fn() => Blocks::SMOOTH_QUARTZ_STAIRS());
		$result->registerBlock("smooth_red_sandstone", fn() => Blocks::SMOOTH_RED_SANDSTONE());
		$result->registerBlock("smooth_red_sandstone_slab", fn() => Blocks::SMOOTH_RED_SANDSTONE_SLAB());
		$result->registerBlock("smooth_red_sandstone_stairs", fn() => Blocks::SMOOTH_RED_SANDSTONE_STAIRS());
		$result->registerBlock("smooth_sandstone", fn() => Blocks::SMOOTH_SANDSTONE());
		$result->registerBlock("smooth_sandstone_slab", fn() => Blocks::SMOOTH_SANDSTONE_SLAB());
		$result->registerBlock("smooth_sandstone_stairs", fn() => Blocks::SMOOTH_SANDSTONE_STAIRS());
		$result->registerBlock("smooth_stone", fn() => Blocks::SMOOTH_STONE());
		$result->registerBlock("smooth_stone_slab", fn() => Blocks::SMOOTH_STONE_SLAB());
		$result->registerBlock("snow", fn() => Blocks::SNOW());
		$result->registerBlock("snow_block", fn() => Blocks::SNOW());
		$result->registerBlock("snow_layer", fn() => Blocks::SNOW_LAYER());
		$result->registerBlock("soul_campfire", fn() => Blocks::SOUL_CAMPFIRE());
		$result->registerBlock("soul_lantern", fn() => Blocks::SOUL_LANTERN());
		$result->registerBlock("soul_sand", fn() => Blocks::SOUL_SAND());
		$result->registerBlock("soul_soil", fn() => Blocks::SOUL_SOIL());
		$result->registerBlock("soul_torch", fn() => Blocks::SOUL_TORCH());
		$result->registerBlock("sponge", fn() => Blocks::SPONGE());
		$result->registerBlock("spore_blossom", fn() => Blocks::SPORE_BLOSSOM());
		$result->registerBlock("spruce_button", fn() => Blocks::SPRUCE_BUTTON());
		$result->registerBlock("spruce_door", fn() => Blocks::SPRUCE_DOOR());
		$result->registerBlock("spruce_door_block", fn() => Blocks::SPRUCE_DOOR());
		$result->registerBlock("spruce_fence", fn() => Blocks::SPRUCE_FENCE());
		$result->registerBlock("spruce_fence_gate", fn() => Blocks::SPRUCE_FENCE_GATE());
		$result->registerBlock("spruce_leaves", fn() => Blocks::SPRUCE_LEAVES());
		$result->registerBlock("spruce_log", fn() => Blocks::SPRUCE_LOG()->setStripped(false));
		$result->registerBlock("spruce_planks", fn() => Blocks::SPRUCE_PLANKS());
		$result->registerBlock("spruce_pressure_plate", fn() => Blocks::SPRUCE_PRESSURE_PLATE());
		$result->registerBlock("spruce_sapling", fn() => Blocks::SPRUCE_SAPLING());
		$result->registerBlock("spruce_sign", fn() => Blocks::SPRUCE_SIGN());
		$result->registerBlock("spruce_slab", fn() => Blocks::SPRUCE_SLAB());
		$result->registerBlock("spruce_stairs", fn() => Blocks::SPRUCE_STAIRS());
		$result->registerBlock("spruce_standing_sign", fn() => Blocks::SPRUCE_SIGN());
		$result->registerBlock("spruce_trapdoor", fn() => Blocks::SPRUCE_TRAPDOOR());
		$result->registerBlock("spruce_wall_sign", fn() => Blocks::SPRUCE_WALL_SIGN());
		$result->registerBlock("spruce_wood", fn() => Blocks::SPRUCE_WOOD()->setStripped(false));
		$result->registerBlock("spruce_wood_stairs", fn() => Blocks::SPRUCE_STAIRS());
		$result->registerBlock("spruce_wooden_stairs", fn() => Blocks::SPRUCE_STAIRS());
		$result->registerBlock("stained_clay", fn() => Blocks::STAINED_CLAY());
		$result->registerBlock("stained_glass", fn() => Blocks::STAINED_GLASS());
		$result->registerBlock("stained_glass_pane", fn() => Blocks::STAINED_GLASS_PANE());
		$result->registerBlock("stained_hardened_clay", fn() => Blocks::STAINED_CLAY());
		$result->registerBlock("stained_hardened_glass", fn() => Blocks::STAINED_HARDENED_GLASS());
		$result->registerBlock("stained_hardened_glass_pane", fn() => Blocks::STAINED_HARDENED_GLASS_PANE());
		$result->registerBlock("standing_banner", fn() => Blocks::BANNER());
		$result->registerBlock("standing_sign", fn() => Blocks::OAK_SIGN());
		$result->registerBlock("still_lava", fn() => Blocks::LAVA()->setStill(true));
		$result->registerBlock("still_water", fn() => Blocks::WATER()->setStill(true));
		$result->registerBlock("stone", fn() => Blocks::STONE());
		$result->registerBlock("stone_brick", fn() => Blocks::STONE_BRICKS());
		$result->registerBlock("stone_brick_slab", fn() => Blocks::STONE_BRICK_SLAB());
		$result->registerBlock("stone_brick_stairs", fn() => Blocks::STONE_BRICK_STAIRS());
		$result->registerBlock("stone_brick_wall", fn() => Blocks::STONE_BRICK_WALL());
		$result->registerBlock("stone_bricks", fn() => Blocks::STONE_BRICKS());
		$result->registerBlock("stone_button", fn() => Blocks::STONE_BUTTON());
		$result->registerBlock("stone_pressure_plate", fn() => Blocks::STONE_PRESSURE_PLATE());
		$result->registerBlock("stone_slab", fn() => Blocks::STONE_SLAB());
		$result->registerBlock("stone_slab2", fn() => Blocks::RED_SANDSTONE_SLAB());
		$result->registerBlock("stone_slab3", fn() => Blocks::END_STONE_BRICK_SLAB());
		$result->registerBlock("stone_slab4", fn() => Blocks::MOSSY_STONE_BRICK_SLAB());
		$result->registerBlock("stone_stairs", fn() => Blocks::STONE_STAIRS());
		$result->registerBlock("stone_wall", fn() => Blocks::COBBLESTONE_WALL());
		$result->registerBlock("stonebrick", fn() => Blocks::STONE_BRICKS());
		$result->registerBlock("stonecutter", fn() => Blocks::STONECUTTER());
		$result->registerBlock("stonecutter_block", fn() => Blocks::STONECUTTER());
		$result->registerBlock("stripped_acacia_log", fn() => Blocks::ACACIA_LOG()->setStripped(true));
		$result->registerBlock("stripped_acacia_wood", fn() => Blocks::ACACIA_WOOD()->setStripped(true));
		$result->registerBlock("stripped_birch_log", fn() => Blocks::BIRCH_LOG()->setStripped(true));
		$result->registerBlock("stripped_birch_wood", fn() => Blocks::BIRCH_WOOD()->setStripped(true));
		$result->registerBlock("stripped_cherry_log", fn() => Blocks::CHERRY_LOG()->setStripped(true));
		$result->registerBlock("stripped_cherry_wood", fn() => Blocks::CHERRY_WOOD()->setStripped(true));
		$result->registerBlock("stripped_crimson_hyphae", fn() => Blocks::CRIMSON_HYPHAE()->setStripped(true));
		$result->registerBlock("stripped_crimson_stem", fn() => Blocks::CRIMSON_STEM()->setStripped(true));
		$result->registerBlock("stripped_dark_oak_log", fn() => Blocks::DARK_OAK_LOG()->setStripped(true));
		$result->registerBlock("stripped_dark_oak_wood", fn() => Blocks::DARK_OAK_WOOD()->setStripped(true));
		$result->registerBlock("stripped_jungle_log", fn() => Blocks::JUNGLE_LOG()->setStripped(true));
		$result->registerBlock("stripped_jungle_wood", fn() => Blocks::JUNGLE_WOOD()->setStripped(true));
		$result->registerBlock("stripped_mangrove_log", fn() => Blocks::MANGROVE_LOG()->setStripped(true));
		$result->registerBlock("stripped_mangrove_wood", fn() => Blocks::MANGROVE_WOOD()->setStripped(true));
		$result->registerBlock("stripped_oak_log", fn() => Blocks::OAK_LOG()->setStripped(true));
		$result->registerBlock("stripped_oak_wood", fn() => Blocks::OAK_WOOD()->setStripped(true));
		$result->registerBlock("stripped_pale_oak_log", fn() => Blocks::PALE_OAK_LOG()->setStripped(true));
		$result->registerBlock("stripped_pale_oak_wood", fn() => Blocks::PALE_OAK_WOOD()->setStripped(true));
		$result->registerBlock("stripped_spruce_log", fn() => Blocks::SPRUCE_LOG()->setStripped(true));
		$result->registerBlock("stripped_spruce_wood", fn() => Blocks::SPRUCE_WOOD()->setStripped(true));
		$result->registerBlock("stripped_warped_hyphae", fn() => Blocks::WARPED_HYPHAE()->setStripped(true));
		$result->registerBlock("stripped_warped_stem", fn() => Blocks::WARPED_STEM()->setStripped(true));
		$result->registerBlock("sugar_cane", fn() => Blocks::SUGARCANE());
		$result->registerBlock("sugar_canes", fn() => Blocks::SUGARCANE());
		$result->registerBlock("sugarcane", fn() => Blocks::SUGARCANE());
		$result->registerBlock("sugarcane_block", fn() => Blocks::SUGARCANE());
		$result->registerBlock("sunflower", fn() => Blocks::SUNFLOWER());
		$result->registerBlock("sweet_berry_bush", fn() => Blocks::SWEET_BERRY_BUSH());
		$result->registerBlock("tall_grass", fn() => Blocks::TALL_GRASS());
		$result->registerBlock("tallgrass", fn() => Blocks::FERN());
		$result->registerBlock("terracotta", fn() => Blocks::STAINED_CLAY());
		$result->registerBlock("tinted_glass", fn() => Blocks::TINTED_GLASS());
		$result->registerBlock("tnt", fn() => Blocks::TNT());
		$result->registerBlock("torch", fn() => Blocks::TORCH());
		$result->registerBlock("torchflower", fn() => Blocks::TORCHFLOWER());
		$result->registerBlock("trapdoor", fn() => Blocks::OAK_TRAPDOOR());
		$result->registerBlock("trapped_chest", fn() => Blocks::TRAPPED_CHEST());
		$result->registerBlock("trip_wire", fn() => Blocks::TRIPWIRE());
		$result->registerBlock("tripwire", fn() => Blocks::TRIPWIRE());
		$result->registerBlock("tripwire_hook", fn() => Blocks::TRIPWIRE_HOOK());
		$result->registerBlock("trunk", fn() => Blocks::OAK_PLANKS());
		$result->registerBlock("trunk2", fn() => Blocks::ACACIA_LOG()->setStripped(false));
		$result->registerBlock("tuff", fn() => Blocks::TUFF());
		$result->registerBlock("tuff_bricks", fn() => Blocks::TUFF_BRICKS());
		$result->registerBlock("tuff_brick_slab", fn() => Blocks::TUFF_BRICK_SLAB());
		$result->registerBlock("tuff_brick_stairs", fn() => Blocks::TUFF_BRICK_STAIRS());
		$result->registerBlock("tuff_brick_wall", fn() => Blocks::TUFF_BRICK_WALL());
		$result->registerBlock("tuff_slab", fn() => Blocks::TUFF_SLAB());
		$result->registerBlock("tuff_stairs", fn() => Blocks::TUFF_STAIRS());
		$result->registerBlock("tuff_wall", fn() => Blocks::TUFF_WALL());
		$result->registerBlock("twisting_vines", fn() => Blocks::TWISTING_VINES());
		$result->registerBlock("underwater_tnt", fn() => Blocks::TNT()->setWorksUnderwater(true));
		$result->registerBlock("underwater_torch", fn() => Blocks::UNDERWATER_TORCH());
		$result->registerBlock("undyed_shulker_box", fn() => Blocks::SHULKER_BOX());
		$result->registerBlock("unlit_redstone_torch", fn() => Blocks::REDSTONE_TORCH());
		$result->registerBlock("unpowered_comparator", fn() => Blocks::REDSTONE_COMPARATOR());
		$result->registerBlock("unpowered_comparator_block", fn() => Blocks::REDSTONE_COMPARATOR());
		$result->registerBlock("unpowered_repeater", fn() => Blocks::REDSTONE_REPEATER());
		$result->registerBlock("unpowered_repeater_block", fn() => Blocks::REDSTONE_REPEATER());
		$result->registerBlock("update_block", fn() => Blocks::INFO_UPDATE());
		$result->registerBlock("vine", fn() => Blocks::VINES());
		$result->registerBlock("vines", fn() => Blocks::VINES());
		$result->registerBlock("wall_banner", fn() => Blocks::WALL_BANNER());
		$result->registerBlock("wall_coral_fan", fn() => Blocks::WALL_CORAL_FAN());
		$result->registerBlock("wall_sign", fn() => Blocks::OAK_WALL_SIGN());
		$result->registerBlock("warped_button", fn() => Blocks::WARPED_BUTTON());
		$result->registerBlock("warped_door", fn() => Blocks::WARPED_DOOR());
		$result->registerBlock("warped_fence", fn() => Blocks::WARPED_FENCE());
		$result->registerBlock("warped_fence_gate", fn() => Blocks::WARPED_FENCE_GATE());
		$result->registerBlock("warped_hyphae", fn() => Blocks::WARPED_HYPHAE()->setStripped(false));
		$result->registerBlock("warped_planks", fn() => Blocks::WARPED_PLANKS());
		$result->registerBlock("warped_pressure_plate", fn() => Blocks::WARPED_PRESSURE_PLATE());
		$result->registerBlock("warped_roots", fn() => Blocks::WARPED_ROOTS());
		$result->registerBlock("warped_sign", fn() => Blocks::WARPED_SIGN());
		$result->registerBlock("warped_slab", fn() => Blocks::WARPED_SLAB());
		$result->registerBlock("warped_stairs", fn() => Blocks::WARPED_STAIRS());
		$result->registerBlock("warped_stem", fn() => Blocks::WARPED_STEM()->setStripped(false));
		$result->registerBlock("warped_trapdoor", fn() => Blocks::WARPED_TRAPDOOR());
		$result->registerBlock("warped_wart_block", fn() => Blocks::WARPED_WART_BLOCK());
		$result->registerBlock("water", fn() => Blocks::WATER());
		$result->registerBlock("water_lily", fn() => Blocks::LILY_PAD());
		$result->registerBlock("waterlily", fn() => Blocks::LILY_PAD());
		$result->registerBlock("web", fn() => Blocks::COBWEB());
		$result->registerBlock("weeping_vines", fn() => Blocks::WEEPING_VINES());
		$result->registerBlock("weighted_pressure_plate_heavy", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_HEAVY());
		$result->registerBlock("weighted_pressure_plate_light", fn() => Blocks::WEIGHTED_PRESSURE_PLATE_LIGHT());
		$result->registerBlock("wheat_block", fn() => Blocks::WHEAT());
		$result->registerBlock("white_tulip", fn() => Blocks::WHITE_TULIP());
		$result->registerBlock("wither_rose", fn() => Blocks::WITHER_ROSE());
		$result->registerBlock("wither_skeleton_skull", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::WITHER_SKELETON));
		$result->registerBlock("wood", fn() => Blocks::OAK_LOG()->setStripped(false));
		$result->registerBlock("wood2", fn() => Blocks::ACACIA_LOG()->setStripped(false));
		$result->registerBlock("wood_door_block", fn() => Blocks::OAK_DOOR());
		$result->registerBlock("wood_slab", fn() => Blocks::OAK_SLAB());
		$result->registerBlock("wood_slabs", fn() => Blocks::OAK_SLAB());
		$result->registerBlock("wood_stairs", fn() => Blocks::OAK_STAIRS());
		$result->registerBlock("wooden_button", fn() => Blocks::OAK_BUTTON());
		$result->registerBlock("wooden_door", fn() => Blocks::OAK_DOOR());
		$result->registerBlock("wooden_door_block", fn() => Blocks::OAK_DOOR());
		$result->registerBlock("wooden_plank", fn() => Blocks::OAK_PLANKS());
		$result->registerBlock("wooden_planks", fn() => Blocks::OAK_PLANKS());
		$result->registerBlock("wooden_pressure_plate", fn() => Blocks::OAK_PRESSURE_PLATE());
		$result->registerBlock("wooden_slab", fn() => Blocks::OAK_SLAB());
		$result->registerBlock("wooden_slabs", fn() => Blocks::OAK_SLAB());
		$result->registerBlock("wooden_stairs", fn() => Blocks::OAK_STAIRS());
		$result->registerBlock("wooden_trapdoor", fn() => Blocks::OAK_TRAPDOOR());
		$result->registerBlock("wool", fn() => Blocks::WOOL());
		$result->registerBlock("workbench", fn() => Blocks::CRAFTING_TABLE());
		$result->registerBlock("yellow_flower", fn() => Blocks::DANDELION());
		$result->registerBlock("zombie_head", fn() => Blocks::MOB_HEAD()->setMobHeadType(MobHeadType::ZOMBIE));
	}

	private static function registerDynamicItems(self $result) : void{
		foreach(DyeColor::cases() as $color){
			$prefix = fn(string $name) => strtolower($color->name) . "_" . $name;

			$result->register($prefix("dye"), fn() => Items::DYE()->setColor($color));
		}

		foreach(GoatHornType::cases() as $goatHornType){
			$prefix = fn(string $name) => strtolower($goatHornType->name) . "_" . $name;

			$result->register($prefix("goat_horn"), fn() => Items::GOAT_HORN()->setHornType($goatHornType));
		}

		foreach(SuspiciousStewType::cases() as $suspiciousStewType){
			$prefix = fn(string $name) => strtolower($suspiciousStewType->name) . "_" . $name;

			$result->register($prefix("suspicious_stew"), fn() => Items::SUSPICIOUS_STEW()->setType($suspiciousStewType));
		}

		foreach(PotionType::cases() as $potionType){
			$prefix = fn(string $name) => strtolower($potionType->name) . "_" . $name;

			$result->register($prefix("potion"), fn() => Items::POTION()->setType($potionType));
			$result->register($prefix("splash_potion"), fn() => Items::SPLASH_POTION()->setType($potionType));
			$result->register($prefix("lingering_potion"), fn() => Items::LINGERING_POTION()->setType($potionType));
		}
	}

	private static function registerItems(self $result) : void{

		$result->register("acacia_boat", fn() => Items::ACACIA_BOAT());
		$result->register("acacia_hanging_sign", fn() => Items::ACACIA_HANGING_SIGN());
		$result->register("amethyst_shard", fn() => Items::AMETHYST_SHARD());
		$result->register("antidote", fn() => Items::MEDICINE()->setType(MedicineType::ANTIDOTE));
		$result->register("apple", fn() => Items::APPLE());
		$result->register("apple_enchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE());
		$result->register("appleenchanted", fn() => Items::ENCHANTED_GOLDEN_APPLE());
		$result->register("arrow", fn() => Items::ARROW());
		$result->register("baked_potato", fn() => Items::BAKED_POTATO());
		$result->register("baked_potatoes", fn() => Items::BAKED_POTATO());
		$result->register("beef", fn() => Items::RAW_BEEF());
		$result->register("beetroot", fn() => Items::BEETROOT());
		$result->register("beetroot_seed", fn() => Items::BEETROOT_SEEDS());
		$result->register("beetroot_seeds", fn() => Items::BEETROOT_SEEDS());
		$result->register("beetroot_soup", fn() => Items::BEETROOT_SOUP());
		$result->register("birch_boat", fn() => Items::BIRCH_BOAT());
		$result->register("birch_hanging_sign", fn() => Items::BIRCH_HANGING_SIGN());
		$result->register("blaze_powder", fn() => Items::BLAZE_POWDER());
		$result->register("blaze_rod", fn() => Items::BLAZE_ROD());
		$result->register("bleach", fn() => Items::BLEACH());
		$result->register("boat", fn() => Items::OAK_BOAT());
		$result->register("bone", fn() => Items::BONE());
		$result->register("bone_meal", fn() => Items::BONE_MEAL());
		$result->register("book", fn() => Items::BOOK());
		$result->register("bottle_o_enchanting", fn() => Items::EXPERIENCE_BOTTLE());
		$result->register("bow", fn() => Items::BOW());
		$result->register("bowl", fn() => Items::BOWL());
		$result->register("bread", fn() => Items::BREAD());
		$result->register("brick", fn() => Items::BRICK());
		$result->register("bucket", fn() => Items::BUCKET());
		$result->register("carrot", fn() => Items::CARROT());
		$result->register("chain_boots", fn() => Items::CHAINMAIL_BOOTS());
		$result->register("chain_chestplate", fn() => Items::CHAINMAIL_CHESTPLATE());
		$result->register("chain_helmet", fn() => Items::CHAINMAIL_HELMET());
		$result->register("chain_leggings", fn() => Items::CHAINMAIL_LEGGINGS());
		$result->register("chainmail_boots", fn() => Items::CHAINMAIL_BOOTS());
		$result->register("chainmail_chestplate", fn() => Items::CHAINMAIL_CHESTPLATE());
		$result->register("chainmail_helmet", fn() => Items::CHAINMAIL_HELMET());
		$result->register("chainmail_leggings", fn() => Items::CHAINMAIL_LEGGINGS());
		$result->register("charcoal", fn() => Items::CHARCOAL());
		$result->register("chemical_aluminium_oxide", fn() => Items::CHEMICAL_ALUMINIUM_OXIDE());
		$result->register("chemical_ammonia", fn() => Items::CHEMICAL_AMMONIA());
		$result->register("chemical_barium_sulphate", fn() => Items::CHEMICAL_BARIUM_SULPHATE());
		$result->register("chemical_benzene", fn() => Items::CHEMICAL_BENZENE());
		$result->register("chemical_boron_trioxide", fn() => Items::CHEMICAL_BORON_TRIOXIDE());
		$result->register("chemical_calcium_bromide", fn() => Items::CHEMICAL_CALCIUM_BROMIDE());
		$result->register("chemical_calcium_chloride", fn() => Items::CHEMICAL_CALCIUM_CHLORIDE());
		$result->register("chemical_cerium_chloride", fn() => Items::CHEMICAL_CERIUM_CHLORIDE());
		$result->register("chemical_charcoal", fn() => Items::CHEMICAL_CHARCOAL());
		$result->register("chemical_crude_oil", fn() => Items::CHEMICAL_CRUDE_OIL());
		$result->register("chemical_glue", fn() => Items::CHEMICAL_GLUE());
		$result->register("chemical_hydrogen_peroxide", fn() => Items::CHEMICAL_HYDROGEN_PEROXIDE());
		$result->register("chemical_hypochlorite", fn() => Items::CHEMICAL_HYPOCHLORITE());
		$result->register("chemical_ink", fn() => Items::CHEMICAL_INK());
		$result->register("chemical_iron_sulphide", fn() => Items::CHEMICAL_IRON_SULPHIDE());
		$result->register("chemical_latex", fn() => Items::CHEMICAL_LATEX());
		$result->register("chemical_lithium_hydride", fn() => Items::CHEMICAL_LITHIUM_HYDRIDE());
		$result->register("chemical_luminol", fn() => Items::CHEMICAL_LUMINOL());
		$result->register("chemical_magnesium_nitrate", fn() => Items::CHEMICAL_MAGNESIUM_NITRATE());
		$result->register("chemical_magnesium_oxide", fn() => Items::CHEMICAL_MAGNESIUM_OXIDE());
		$result->register("chemical_magnesium_salts", fn() => Items::CHEMICAL_MAGNESIUM_SALTS());
		$result->register("chemical_mercuric_chloride", fn() => Items::CHEMICAL_MERCURIC_CHLORIDE());
		$result->register("chemical_polyethylene", fn() => Items::CHEMICAL_POLYETHYLENE());
		$result->register("chemical_potassium_chloride", fn() => Items::CHEMICAL_POTASSIUM_CHLORIDE());
		$result->register("chemical_potassium_iodide", fn() => Items::CHEMICAL_POTASSIUM_IODIDE());
		$result->register("chemical_rubbish", fn() => Items::CHEMICAL_RUBBISH());
		$result->register("chemical_salt", fn() => Items::CHEMICAL_SALT());
		$result->register("chemical_soap", fn() => Items::CHEMICAL_SOAP());
		$result->register("chemical_sodium_acetate", fn() => Items::CHEMICAL_SODIUM_ACETATE());
		$result->register("chemical_sodium_fluoride", fn() => Items::CHEMICAL_SODIUM_FLUORIDE());
		$result->register("chemical_sodium_hydride", fn() => Items::CHEMICAL_SODIUM_HYDRIDE());
		$result->register("chemical_sodium_hydroxide", fn() => Items::CHEMICAL_SODIUM_HYDROXIDE());
		$result->register("chemical_sodium_hypochlorite", fn() => Items::CHEMICAL_SODIUM_HYPOCHLORITE());
		$result->register("chemical_sodium_oxide", fn() => Items::CHEMICAL_SODIUM_OXIDE());
		$result->register("chemical_sugar", fn() => Items::CHEMICAL_SUGAR());
		$result->register("chemical_sulphate", fn() => Items::CHEMICAL_SULPHATE());
		$result->register("chemical_tungsten_chloride", fn() => Items::CHEMICAL_TUNGSTEN_CHLORIDE());
		$result->register("chemical_water", fn() => Items::CHEMICAL_WATER());
		$result->register("cherry_hanging_sign", fn() => Items::CHERRY_HANGING_SIGN());
		$result->register("chicken", fn() => Items::RAW_CHICKEN());
		$result->register("chorus_fruit", fn() => Items::CHORUS_FRUIT());
		$result->register("chorus_fruit_popped", fn() => Items::POPPED_CHORUS_FRUIT());
		$result->register("clay", fn() => Items::CLAY());
		$result->register("clay_ball", fn() => Items::CLAY());
		$result->register("clock", fn() => Items::CLOCK());
		$result->register("clown_fish", fn() => Items::CLOWNFISH());
		$result->register("clownfish", fn() => Items::CLOWNFISH());
		$result->register("coal", fn() => Items::COAL());
		$result->register("coast_armor_trim_smithing_template", fn() => Items::COAST_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("cocoa_beans", fn() => Items::COCOA_BEANS());
		$result->register("cod", fn() => Items::RAW_FISH());
		$result->register("compass", fn() => Items::COMPASS());
		$result->register("compound", fn() => Items::CHEMICAL_SALT());
		$result->register("cooked_beef", fn() => Items::STEAK());
		$result->register("cooked_chicken", fn() => Items::COOKED_CHICKEN());
		$result->register("cooked_cod", fn() => Items::COOKED_FISH());
		$result->register("cooked_fish", fn() => Items::COOKED_FISH());
		$result->register("cooked_mutton", fn() => Items::COOKED_MUTTON());
		$result->register("cooked_porkchop", fn() => Items::COOKED_PORKCHOP());
		$result->register("cooked_rabbit", fn() => Items::COOKED_RABBIT());
		$result->register("cooked_salmon", fn() => Items::COOKED_SALMON());
		$result->register("cookie", fn() => Items::COOKIE());
		$result->register("copper_ingot", fn() => Items::COPPER_INGOT());
		$result->register("crimson_hanging_sign", fn() => Items::CRIMSON_HANGING_SIGN());
		$result->register("dark_oak_boat", fn() => Items::DARK_OAK_BOAT());
		$result->register("dark_oak_hanging_sign", fn() => Items::DARK_OAK_HANGING_SIGN());
		$result->register("diamond", fn() => Items::DIAMOND());
		$result->register("diamond_axe", fn() => Items::DIAMOND_AXE());
		$result->register("diamond_boots", fn() => Items::DIAMOND_BOOTS());
		$result->register("diamond_chestplate", fn() => Items::DIAMOND_CHESTPLATE());
		$result->register("diamond_helmet", fn() => Items::DIAMOND_HELMET());
		$result->register("diamond_hoe", fn() => Items::DIAMOND_HOE());
		$result->register("diamond_leggings", fn() => Items::DIAMOND_LEGGINGS());
		$result->register("diamond_pickaxe", fn() => Items::DIAMOND_PICKAXE());
		$result->register("diamond_shovel", fn() => Items::DIAMOND_SHOVEL());
		$result->register("diamond_sword", fn() => Items::DIAMOND_SWORD());
		$result->register("disc_fragment_5", fn() => Items::DISC_FRAGMENT_5());
		$result->register("dragon_breath", fn() => Items::DRAGON_BREATH());
		$result->register("dried_kelp", fn() => Items::DRIED_KELP());
		$result->register("dune_armor_trim_smithing_template", fn() => Items::DUNE_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("dye", fn() => Items::INK_SAC());
		$result->register("echo_shard", fn() => Items::ECHO_SHARD());
		$result->register("egg", fn() => Items::EGG());
		$result->register("elixir", fn() => Items::MEDICINE()->setType(MedicineType::ELIXIR));
		$result->register("emerald", fn() => Items::EMERALD());
		$result->register("enchanted_book", fn() => Items::ENCHANTED_BOOK());
		$result->register("enchanted_golden_apple", fn() => Items::ENCHANTED_GOLDEN_APPLE());
		$result->register("enchanting_bottle", fn() => Items::EXPERIENCE_BOTTLE());
		$result->register("end_crystal", fn() => Items::END_CRYSTAL());
		$result->register("ender_pearl", fn() => Items::ENDER_PEARL());
		$result->register("experience_bottle", fn() => Items::EXPERIENCE_BOTTLE());
		$result->register("eye_armor_trim_smithing_template", fn() => Items::EYE_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("eye_drops", fn() => Items::MEDICINE()->setType(MedicineType::EYE_DROPS));
		$result->register("feather", fn() => Items::FEATHER());
		$result->register("fermented_spider_eye", fn() => Items::FERMENTED_SPIDER_EYE());
		$result->register("firework_rocket", fn() => Items::FIREWORK_ROCKET());
		$result->register("firework_star", fn() => Items::FIREWORK_STAR());
		$result->register("fireworks", fn() => Items::FIREWORK_ROCKET());
		$result->register("fire_charge", fn() => Items::FIRE_CHARGE());
		$result->register("fish", fn() => Items::RAW_FISH());
		$result->register("fishing_rod", fn() => Items::FISHING_ROD());
		$result->register("flint", fn() => Items::FLINT());
		$result->register("flint_and_steel", fn() => Items::FLINT_AND_STEEL());
		$result->register("flint_steel", fn() => Items::FLINT_AND_STEEL());
		$result->register("ghast_tear", fn() => Items::GHAST_TEAR());
		$result->register("glass_bottle", fn() => Items::GLASS_BOTTLE());
		$result->register("glistering_melon", fn() => Items::GLISTERING_MELON());
		$result->register("glow_berries", fn() => Items::GLOW_BERRIES());
		$result->register("glow_ink_sac", fn() => Items::GLOW_INK_SAC());
		$result->register("glowstone_dust", fn() => Items::GLOWSTONE_DUST());
		$result->register("goat_horn", fn() => Items::GOAT_HORN());
		$result->register("gold_axe", fn() => Items::GOLDEN_AXE());
		$result->register("gold_boots", fn() => Items::GOLDEN_BOOTS());
		$result->register("gold_chestplate", fn() => Items::GOLDEN_CHESTPLATE());
		$result->register("gold_helmet", fn() => Items::GOLDEN_HELMET());
		$result->register("gold_hoe", fn() => Items::GOLDEN_HOE());
		$result->register("gold_ingot", fn() => Items::GOLD_INGOT());
		$result->register("gold_leggings", fn() => Items::GOLDEN_LEGGINGS());
		$result->register("gold_nugget", fn() => Items::GOLD_NUGGET());
		$result->register("gold_pickaxe", fn() => Items::GOLDEN_PICKAXE());
		$result->register("gold_shovel", fn() => Items::GOLDEN_SHOVEL());
		$result->register("gold_sword", fn() => Items::GOLDEN_SWORD());
		$result->register("golden_apple", fn() => Items::GOLDEN_APPLE());
		$result->register("golden_axe", fn() => Items::GOLDEN_AXE());
		$result->register("golden_boots", fn() => Items::GOLDEN_BOOTS());
		$result->register("golden_carrot", fn() => Items::GOLDEN_CARROT());
		$result->register("golden_chestplate", fn() => Items::GOLDEN_CHESTPLATE());
		$result->register("golden_helmet", fn() => Items::GOLDEN_HELMET());
		$result->register("golden_hoe", fn() => Items::GOLDEN_HOE());
		$result->register("golden_leggings", fn() => Items::GOLDEN_LEGGINGS());
		$result->register("golden_nugget", fn() => Items::GOLD_NUGGET());
		$result->register("golden_pickaxe", fn() => Items::GOLDEN_PICKAXE());
		$result->register("golden_shovel", fn() => Items::GOLDEN_SHOVEL());
		$result->register("golden_sword", fn() => Items::GOLDEN_SWORD());
		$result->register("gunpowder", fn() => Items::GUNPOWDER());
		$result->register("heart_of_the_sea", fn() => Items::HEART_OF_THE_SEA());
		$result->register("honey_bottle", fn() => Items::HONEY_BOTTLE());
		$result->register("host_armor_trim_smithing_template", fn() => Items::HOST_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("honeycomb", fn() => Items::HONEYCOMB());
		$result->register("ice_bomb", fn() => Items::ICE_BOMB());
		$result->register("ink_sac", fn() => Items::INK_SAC());
		$result->register("iron_axe", fn() => Items::IRON_AXE());
		$result->register("iron_boots", fn() => Items::IRON_BOOTS());
		$result->register("iron_chestplate", fn() => Items::IRON_CHESTPLATE());
		$result->register("iron_helmet", fn() => Items::IRON_HELMET());
		$result->register("iron_hoe", fn() => Items::IRON_HOE());
		$result->register("iron_ingot", fn() => Items::IRON_INGOT());
		$result->register("iron_leggings", fn() => Items::IRON_LEGGINGS());
		$result->register("iron_nugget", fn() => Items::IRON_NUGGET());
		$result->register("iron_pickaxe", fn() => Items::IRON_PICKAXE());
		$result->register("iron_shovel", fn() => Items::IRON_SHOVEL());
		$result->register("iron_sword", fn() => Items::IRON_SWORD());
		$result->register("jungle_boat", fn() => Items::JUNGLE_BOAT());
		$result->register("jungle_hanging_sign", fn() => Items::JUNGLE_HANGING_SIGN());
		$result->register("lapis_lazuli", fn() => Items::LAPIS_LAZULI());
		$result->register("lava_bucket", fn() => Items::LAVA_BUCKET());
		$result->register("leather", fn() => Items::LEATHER());
		$result->register("leather_boots", fn() => Items::LEATHER_BOOTS());
		$result->register("leather_cap", fn() => Items::LEATHER_CAP());
		$result->register("leather_chestplate", fn() => Items::LEATHER_TUNIC());
		$result->register("leather_helmet", fn() => Items::LEATHER_CAP());
		$result->register("leather_leggings", fn() => Items::LEATHER_PANTS());
		$result->register("leather_pants", fn() => Items::LEATHER_PANTS());
		$result->register("leather_tunic", fn() => Items::LEATHER_TUNIC());
		$result->register("magma_cream", fn() => Items::MAGMA_CREAM());
		$result->register("mangrove_hanging_sign", fn() => Items::MANGROVE_HANGING_SIGN());
		$result->register("melon", fn() => Items::MELON());
		$result->register("melon_seeds", fn() => Items::MELON_SEEDS());
		$result->register("melon_slice", fn() => Items::MELON());
		$result->register("milk_bucket", fn() => Items::MILK_BUCKET());
		$result->register("minecart", fn() => Items::MINECART());
		$result->register("mushroom_stew", fn() => Items::MUSHROOM_STEW());
		$result->register("mutton", fn() => Items::RAW_MUTTON());
		$result->register("mutton_cooked", fn() => Items::COOKED_MUTTON());
		$result->register("mutton_raw", fn() => Items::RAW_MUTTON());
		$result->register("muttoncooked", fn() => Items::COOKED_MUTTON());
		$result->register("muttonraw", fn() => Items::RAW_MUTTON());
		$result->register("name_tag", fn() => Items::NAME_TAG());
		$result->register("nautilus_shell", fn() => Items::NAUTILUS_SHELL());
		$result->register("nether_brick", fn() => Items::NETHER_BRICK());
		$result->register("nether_quartz", fn() => Items::NETHER_QUARTZ());
		$result->register("nether_star", fn() => Items::NETHER_STAR());
		$result->register("netherbrick", fn() => Items::NETHER_BRICK());
		$result->register("netherite_axe", fn() => Items::NETHERITE_AXE());
		$result->register("netherite_boots", fn() => Items::NETHERITE_BOOTS());
		$result->register("netherite_chestplate", fn() => Items::NETHERITE_CHESTPLATE());
		$result->register("netherite_helmet", fn() => Items::NETHERITE_HELMET());
		$result->register("netherite_hoe", fn() => Items::NETHERITE_HOE());
		$result->register("netherite_ingot", fn() => Items::NETHERITE_INGOT());
		$result->register("netherite_leggings", fn() => Items::NETHERITE_LEGGINGS());
		$result->register("netherite_pickaxe", fn() => Items::NETHERITE_PICKAXE());
		$result->register("netherite_scrap", fn() => Items::NETHERITE_SCRAP());
		$result->register("netherite_shovel", fn() => Items::NETHERITE_SHOVEL());
		$result->register("netherite_sword", fn() => Items::NETHERITE_SWORD());
		$result->register("netherstar", fn() => Items::NETHER_STAR());
		$result->register("netherite_upgrade_smithing_template", fn() => Items::NETHERITE_UPGRADE_SMITHING_TEMPLATE());
		$result->register("oak_boat", fn() => Items::OAK_BOAT());
		$result->register("oak_hanging_sign", fn() => Items::OAK_HANGING_SIGN());
		$result->register("painting", fn() => Items::PAINTING());
		$result->register("pale_oak_hanging_sign", fn() => Items::PALE_OAK_HANGING_SIGN());
		$result->register("paper", fn() => Items::PAPER());
		$result->register("phantom_membrane", fn() => Items::PHANTOM_MEMBRANE());
		$result->register("pitcher_pod", fn() => Items::PITCHER_POD());
		$result->register("poisonous_potato", fn() => Items::POISONOUS_POTATO());
		$result->register("popped_chorus_fruit", fn() => Items::POPPED_CHORUS_FRUIT());
		$result->register("porkchop", fn() => Items::RAW_PORKCHOP());
		$result->register("potato", fn() => Items::POTATO());
		$result->register("potion", fn() => Items::POTION());
		$result->register("prismarine_crystals", fn() => Items::PRISMARINE_CRYSTALS());
		$result->register("prismarine_shard", fn() => Items::PRISMARINE_SHARD());
		$result->register("puffer_fish", fn() => Items::PUFFERFISH());
		$result->register("pufferfish", fn() => Items::PUFFERFISH());
		$result->register("pumpkin_pie", fn() => Items::PUMPKIN_PIE());
		$result->register("pumpkin_seeds", fn() => Items::PUMPKIN_SEEDS());
		$result->register("quartz", fn() => Items::NETHER_QUARTZ());
		$result->register("rabbit", fn() => Items::RAW_RABBIT());
		$result->register("rabbit_foot", fn() => Items::RABBIT_FOOT());
		$result->register("rabbit_hide", fn() => Items::RABBIT_HIDE());
		$result->register("rabbit_stew", fn() => Items::RABBIT_STEW());
		$result->register("raiser_armor_trim_smithing_template", fn() => Items::RAISER_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("raw_beef", fn() => Items::RAW_BEEF());
		$result->register("raw_cod", fn() => Items::RAW_FISH());
		$result->register("raw_copper", fn() => Items::RAW_COPPER());
		$result->register("raw_chicken", fn() => Items::RAW_CHICKEN());
		$result->register("raw_fish", fn() => Items::RAW_FISH());
		$result->register("raw_gold", fn() => Items::RAW_GOLD());
		$result->register("raw_iron", fn() => Items::RAW_IRON());
		$result->register("raw_mutton", fn() => Items::RAW_MUTTON());
		$result->register("raw_porkchop", fn() => Items::RAW_PORKCHOP());
		$result->register("raw_rabbit", fn() => Items::RAW_RABBIT());
		$result->register("raw_salmon", fn() => Items::RAW_SALMON());
		$result->register("record_11", fn() => Items::RECORD_11());
		$result->register("record_13", fn() => Items::RECORD_13());
		$result->register("record_5", fn() => Items::RECORD_5());
		$result->register("record_blocks", fn() => Items::RECORD_BLOCKS());
		$result->register("record_cat", fn() => Items::RECORD_CAT());
		$result->register("record_chirp", fn() => Items::RECORD_CHIRP());
		$result->register("record_creator", fn() => Items::RECORD_CREATOR());
		$result->register("record_creator_music_box", fn() => Items::RECORD_CREATOR_MUSIC_BOX());
		$result->register("record_far", fn() => Items::RECORD_FAR());
		$result->register("record_mall", fn() => Items::RECORD_MALL());
		$result->register("record_mellohi", fn() => Items::RECORD_MELLOHI());
		$result->register("record_otherside", fn() => Items::RECORD_OTHERSIDE());
		$result->register("record_pigstep", fn() => Items::RECORD_PIGSTEP());
		$result->register("record_precipice", fn() => Items::RECORD_PRECIPICE());
		$result->register("record_relic", fn() => Items::RECORD_RELIC());
		$result->register("record_stal", fn() => Items::RECORD_STAL());
		$result->register("record_strad", fn() => Items::RECORD_STRAD());
		$result->register("record_wait", fn() => Items::RECORD_WAIT());
		$result->register("record_ward", fn() => Items::RECORD_WARD());
		$result->register("recovery_compass", fn() => Items::RECOVERY_COMPASS());
		$result->register("redstone", fn() => Items::REDSTONE_DUST());
		$result->register("redstone_dust", fn() => Items::REDSTONE_DUST());
		$result->register("resin_brick", fn() => Items::RESIN_BRICK());
		$result->register("rib_armor_trim_smithing_template", fn() => Items::RIB_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("rotten_flesh", fn() => Items::ROTTEN_FLESH());
		$result->register("salmon", fn() => Items::RAW_SALMON());
		$result->register("scute", fn() => Items::SCUTE());
		$result->register("sentry_armor_trim_smithing_template", fn() => Items::SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("shaper_armor_trim_smithing_template", fn() => Items::SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("seeds", fn() => Items::WHEAT_SEEDS());
		$result->register("shears", fn() => Items::SHEARS());
		$result->register("shulker_shell", fn() => Items::SHULKER_SHELL());
		$result->register("silence_armor_trim_smithing_template", fn() => Items::SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("slime_ball", fn() => Items::SLIMEBALL());
		$result->register("snout_armor_trim_smithing_template", fn() => Items::SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("slimeball", fn() => Items::SLIMEBALL());
		$result->register("snowball", fn() => Items::SNOWBALL());
		$result->register("speckled_melon", fn() => Items::GLISTERING_MELON());
		$result->register("spider_eye", fn() => Items::SPIDER_EYE());
		$result->register("spire_armor_trim_smithing_template", fn() => Items::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("splash_potion", fn() => Items::SPLASH_POTION());
		$result->register("spruce_boat", fn() => Items::SPRUCE_BOAT());
		$result->register("spruce_hanging_sign", fn() => Items::SPRUCE_HANGING_SIGN());
		$result->register("spyglass", fn() => Items::SPYGLASS());
		$result->register("squid_spawn_egg", fn() => Items::SQUID_SPAWN_EGG());
		$result->register("steak", fn() => Items::STEAK());
		$result->register("stick", fn() => Items::STICK());
		$result->register("sticks", fn() => Items::STICK());
		$result->register("stone_axe", fn() => Items::STONE_AXE());
		$result->register("stone_hoe", fn() => Items::STONE_HOE());
		$result->register("stone_pickaxe", fn() => Items::STONE_PICKAXE());
		$result->register("stone_shovel", fn() => Items::STONE_SHOVEL());
		$result->register("stone_sword", fn() => Items::STONE_SWORD());
		$result->register("string", fn() => Items::STRING());
		$result->register("sugar", fn() => Items::SUGAR());
		$result->register("suspicious_stew", fn() => Items::SUSPICIOUS_STEW());
		$result->register("sweet_berries", fn() => Items::SWEET_BERRIES());
		$result->register("tonic", fn() => Items::MEDICINE()->setType(MedicineType::TONIC));
		$result->register("torchflower_seeds", fn() => Items::TORCHFLOWER_SEEDS());
		$result->register("tide_armor_trim_smithing_template", fn() => Items::TIDE_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("totem", fn() => Items::TOTEM());
		$result->register("trident", fn() => Items::TRIDENT());
		$result->register("turtle_helmet", fn() => Items::TURTLE_HELMET());
		$result->register("vex_armor_trim_smithing_template", fn() => Items::VEX_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("turtle_shell_piece", fn() => Items::SCUTE());
		$result->register("villager_spawn_egg", fn() => Items::VILLAGER_SPAWN_EGG());
		$result->register("ward_armor_trim_smithing_template", fn() => Items::WARD_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("warped_hanging_sign", fn() => Items::WARPED_HANGING_SIGN());
		$result->register("water_bucket", fn() => Items::WATER_BUCKET());
		$result->register("wayfinder_armor_trim_smithing_template", fn() => Items::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("wheat", fn() => Items::WHEAT());
		$result->register("wheat_seeds", fn() => Items::WHEAT_SEEDS());
		$result->register("wild_armor_trim_smithing_template", fn() => Items::WILD_ARMOR_TRIM_SMITHING_TEMPLATE());
		$result->register("wooden_axe", fn() => Items::WOODEN_AXE());
		$result->register("wooden_hoe", fn() => Items::WOODEN_HOE());
		$result->register("wooden_pickaxe", fn() => Items::WOODEN_PICKAXE());
		$result->register("wooden_shovel", fn() => Items::WOODEN_SHOVEL());
		$result->register("wooden_sword", fn() => Items::WOODEN_SWORD());
		$result->register("writable_book", fn() => Items::WRITABLE_BOOK());
		$result->register("written_book", fn() => Items::WRITTEN_BOOK());
		$result->register("zombie_spawn_egg", fn() => Items::ZOMBIE_SPAWN_EGG());
	}

	/**
	 * @var true[][]
	 * @phpstan-var array<int, array<string, true>>
	 */
	private array $reverseMap = [];

	public function register(string $alias, \Closure $callback) : void{
		parent::register($alias, $callback);
		$item = $callback($alias);
		$this->reverseMap[$item->getStateId()][$alias] = true;
	}

	public function override(string $alias, \Closure $callback) : void{
		$oldItem = $this->parse($alias);
		if($oldItem !== null){
			$oldStateId = $oldItem->getStateId();
			unset($this->reverseMap[$oldStateId][$alias]);
			if(count($this->reverseMap[$oldStateId]) === 0){
				unset($this->reverseMap[$oldStateId]);
			}
		}
		parent::override($alias, $callback);
		$newItem = $callback($alias);
		$this->reverseMap[$newItem->getStateId()][$alias] = true;
	}

	/** @phpstan-param \Closure(string $input) : Block $callback */
	public function registerBlock(string $alias, \Closure $callback) : void{
		$this->register($alias, fn(string $input) => $callback($input)->asItem());
	}

	public function parse(string $input) : ?Item{
		return parent::parse($input);
	}

	/**
	 * Returns a list of currently registered aliases that resolve to the given item.
	 *
	 * @return string[]
	 * @phpstan-return list<string>
	 */
	public function lookupAliases(Item $item) : array{
		$aliases = $this->reverseMap[$item->getStateId()] ?? [];
		return array_keys($aliases);
	}

	/**
	 * Returns a list of currently registered aliases that resolve to the item form of the given block.
	 *
	 * @return string[]
	 * @phpstan-return list<string>
	 */
	public function lookupBlockAliases(Block $block) : array{
		return $this->lookupAliases($block->asItem());
	}
}
